From 301368a0df9a3263bd5b0ea9c10168bf57912804 Mon Sep 17 00:00:00 2001 From: Keavon Chambers Date: Fri, 20 Jun 2025 04:51:06 -0700 Subject: [PATCH 01/44] Add basic donation statistics to the website --- website/content/donate.md | 41 ++++++++++++++++++++++++++++++++++- website/sass/page/donate.scss | 4 ++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/website/content/donate.md b/website/content/donate.md index dc53b5f4af..b1153494fe 100644 --- a/website/content/donate.md +++ b/website/content/donate.md @@ -2,7 +2,7 @@ title = "Donate" [extra] -css = ["/page/donate.css", "/component/feature-box.css"] +css = ["/page/donate.css", "/component/feature-box.css", "/component/feature-icons.css"] +++
@@ -26,6 +26,45 @@ css = ["/page/donate.css", "/component/feature-box.css"]

+
+
+ + +
+
+ + +
+
+ + +
+
+ + + Graphite is 100% built and funded by the community. Your contributions directly help us level up the scope and speed of the project's development. Resources are put towards infrastructure, operational costs, swag to keep contributors happy and motivated, and outreach like exhibiting at conventions and traveling to conferences to foster industry relationships. Hiring full-time developers is the next crucial milestone. diff --git a/website/sass/page/donate.scss b/website/sass/page/donate.scss index a7433473ca..d85c67f706 100644 --- a/website/sass/page/donate.scss +++ b/website/sass/page/donate.scss @@ -21,6 +21,10 @@ } } +.statistics:has(span:empty) { + visibility: hidden; +} + #supporter-memberships, #corporate-sponsorships { .triptych { From 990d5b37cf0998dc5927d15d5441c4c0c127ecc0 Mon Sep 17 00:00:00 2001 From: Firestar99 Date: Sun, 22 Jun 2025 01:08:33 +0200 Subject: [PATCH 02/44] Bulk `gcore` cleanup, replace `core` and `alloc` with `std` (#2735) * gcore: replace `core` and `alloc` paths with `std` * node-graph: remove unnecessary path prefix * gcore: remove most `#[cfg(target_arch = "spirv")]`, keep some potentially useful ones --------- Co-authored-by: Keavon Chambers --- node-graph/gcore/src/application_io.rs | 20 +++--- node-graph/gcore/src/context.rs | 18 +++--- node-graph/gcore/src/generic.rs | 2 +- node-graph/gcore/src/graphic_element.rs | 4 +- .../gcore/src/graphic_element/renderer.rs | 24 +++---- .../src/graphic_element/renderer/quad.rs | 2 +- .../src/graphic_element/renderer/rect.rs | 10 +-- node-graph/gcore/src/instances.rs | 4 +- node-graph/gcore/src/lib.rs | 28 ++++---- node-graph/gcore/src/logic.rs | 5 +- node-graph/gcore/src/memo.rs | 28 ++++---- node-graph/gcore/src/ops.rs | 33 +++++----- node-graph/gcore/src/raster.rs | 12 ++-- node-graph/gcore/src/raster/adjustments.rs | 23 +++---- node-graph/gcore/src/raster/bbox.rs | 6 +- node-graph/gcore/src/raster/brush_cache.rs | 10 +-- node-graph/gcore/src/raster/color.rs | 5 +- node-graph/gcore/src/raster/curve.rs | 9 +-- node-graph/gcore/src/raster/discrete_srgb.rs | 2 +- node-graph/gcore/src/raster/image.rs | 15 ++--- node-graph/gcore/src/registry.rs | 36 +++++------ node-graph/gcore/src/structural.rs | 16 ++--- node-graph/gcore/src/text/font_cache.rs | 4 +- node-graph/gcore/src/transform.rs | 4 +- node-graph/gcore/src/types.rs | 44 ++++++------- node-graph/gcore/src/uuid.rs | 6 +- node-graph/gcore/src/value.rs | 4 +- .../vector/algorithms/bezpath_algorithms.rs | 6 +- .../gcore/src/vector/algorithms/instance.rs | 2 +- .../src/vector/algorithms/offset_subpath.rs | 2 +- .../src/vector/algorithms/poisson_disk.rs | 4 +- node-graph/gcore/src/vector/style.rs | 14 ++-- node-graph/gcore/src/vector/vector_data.rs | 6 +- .../src/vector/vector_data/attributes.rs | 64 +++++++++---------- .../src/vector/vector_data/modification.rs | 8 +-- node-graph/gcore/src/vector/vector_nodes.rs | 50 +++++++-------- node-graph/graph-craft/src/document.rs | 8 +-- node-graph/graph-craft/src/proto.rs | 6 +- node-graph/graphene-cli/src/main.rs | 2 +- node-graph/gstd/src/vector.rs | 2 +- .../interpreted-executor/src/node_registry.rs | 18 +++--- node-graph/interpreted-executor/src/util.rs | 2 +- node-graph/node-macro/src/codegen.rs | 8 +-- .../node-macro/src/derive_choice_type.rs | 16 ++--- node-graph/node-macro/src/parsing.rs | 6 +- node-graph/wgpu-executor/src/context.rs | 2 +- 46 files changed, 287 insertions(+), 313 deletions(-) diff --git a/node-graph/gcore/src/application_io.rs b/node-graph/gcore/src/application_io.rs index c3c44d6bb5..6dfd2863ea 100644 --- a/node-graph/gcore/src/application_io.rs +++ b/node-graph/gcore/src/application_io.rs @@ -1,22 +1,22 @@ use crate::text::FontCache; use crate::transform::Footprint; use crate::vector::style::ViewMode; -use alloc::sync::Arc; -use core::fmt::Debug; -use core::future::Future; -use core::hash::{Hash, Hasher}; -use core::pin::Pin; -use core::ptr::addr_of; -use core::time::Duration; use dyn_any::{DynAny, StaticType, StaticTypeSized}; use glam::{DAffine2, UVec2}; +use std::fmt::Debug; +use std::future::Future; +use std::hash::{Hash, Hasher}; +use std::pin::Pin; +use std::ptr::addr_of; +use std::sync::Arc; +use std::time::Duration; #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct SurfaceId(pub u64); -impl core::fmt::Display for SurfaceId { - fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { +impl std::fmt::Display for SurfaceId { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.write_fmt(format_args!("{}", self.0)) } } @@ -298,7 +298,7 @@ impl PartialEq for EditorApi { } impl Debug for EditorApi { - fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("EditorApi").field("font_cache", &self.font_cache).finish() } } diff --git a/node-graph/gcore/src/context.rs b/node-graph/gcore/src/context.rs index 6eedf1ec4c..3adb839b0b 100644 --- a/node-graph/gcore/src/context.rs +++ b/node-graph/gcore/src/context.rs @@ -1,7 +1,7 @@ use crate::transform::Footprint; -use core::any::Any; -use core::borrow::Borrow; -use core::panic::Location; +use std::any::Any; +use std::borrow::Borrow; +use std::panic::Location; use std::sync::Arc; pub trait Ctx: Clone + Send {} @@ -240,7 +240,7 @@ type DynBox = Box; #[derive(dyn_any::DynAny)] pub struct OwnedContextImpl { - footprint: Option, + footprint: Option, varargs: Option>, parent: Option>, // This could be converted into a single enum to save extra bytes @@ -249,8 +249,8 @@ pub struct OwnedContextImpl { animation_time: Option, } -impl core::fmt::Debug for OwnedContextImpl { - fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { +impl std::fmt::Debug for OwnedContextImpl { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("OwnedContextImpl") .field("footprint", &self.footprint) .field("varargs", &self.varargs) @@ -269,8 +269,8 @@ impl Default for OwnedContextImpl { } } -impl core::hash::Hash for OwnedContextImpl { - fn hash(&self, state: &mut H) { +impl std::hash::Hash for OwnedContextImpl { + fn hash(&self, state: &mut H) { self.footprint.hash(state); self.varargs.as_ref().map(|x| Arc::as_ptr(x).addr()).hash(state); self.parent.as_ref().map(|x| Arc::as_ptr(x).addr()).hash(state); @@ -348,7 +348,7 @@ impl OwnedContextImpl { #[derive(Default, Clone, Copy, dyn_any::DynAny)] pub struct ContextImpl<'a> { - pub(crate) footprint: Option<&'a crate::transform::Footprint>, + pub(crate) footprint: Option<&'a Footprint>, varargs: Option<&'a [DynRef<'a>]>, // This could be converted into a single enum to save extra bytes index: Option, diff --git a/node-graph/gcore/src/generic.rs b/node-graph/gcore/src/generic.rs index c3a289a354..055c0cb53d 100644 --- a/node-graph/gcore/src/generic.rs +++ b/node-graph/gcore/src/generic.rs @@ -1,5 +1,5 @@ use crate::Node; -use core::marker::PhantomData; +use std::marker::PhantomData; #[derive(Clone)] pub struct FnNode O, I, O>(T, PhantomData<(I, O)>); diff --git a/node-graph/gcore/src/graphic_element.rs b/node-graph/gcore/src/graphic_element.rs index 4f21cdfc0c..8bc1fab7f5 100644 --- a/node-graph/gcore/src/graphic_element.rs +++ b/node-graph/gcore/src/graphic_element.rs @@ -26,8 +26,8 @@ impl Default for AlphaBlending { Self::new() } } -impl core::hash::Hash for AlphaBlending { - fn hash(&self, state: &mut H) { +impl Hash for AlphaBlending { + fn hash(&self, state: &mut H) { self.opacity.to_bits().hash(state); self.fill.to_bits().hash(state); self.blend_mode.hash(state); diff --git a/node-graph/gcore/src/graphic_element/renderer.rs b/node-graph/gcore/src/graphic_element/renderer.rs index 52c007ac6c..00581b9149 100644 --- a/node-graph/gcore/src/graphic_element/renderer.rs +++ b/node-graph/gcore/src/graphic_element/renderer.rs @@ -39,7 +39,7 @@ impl FreePoint { #[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)] pub enum ClickTargetType { - Subpath(bezier_rs::Subpath), + Subpath(Subpath), FreePoint(FreePoint), } @@ -75,7 +75,7 @@ impl MaskType { } impl ClickTarget { - pub fn new_with_subpath(subpath: bezier_rs::Subpath, stroke_width: f64) -> Self { + pub fn new_with_subpath(subpath: Subpath, stroke_width: f64) -> Self { let bounding_box = subpath.loose_bounding_box(); Self { target_type: ClickTargetType::Subpath(subpath), @@ -300,7 +300,7 @@ impl Default for SvgRender { #[derive(Clone, Debug, Default)] pub struct RenderContext { #[cfg(feature = "wgpu")] - pub resource_overrides: std::collections::HashMap>, + pub resource_overrides: HashMap>, } /// Static state used whilst rendering @@ -468,7 +468,7 @@ impl GraphicElementRendered for GraphicGroupTable { peniko::BlendMode::new(blend_mode, peniko::Compose::SrcOver), opacity, kurbo::Affine::IDENTITY, - &vello::kurbo::Rect::new(bounds[0].x, bounds[0].y, bounds[1].x, bounds[1].y), + &kurbo::Rect::new(bounds[0].x, bounds[0].y, bounds[1].x, bounds[1].y), ); layer = true; } @@ -756,9 +756,9 @@ impl GraphicElementRendered for VectorDataTable { let outline_stroke = kurbo::Stroke { width: LAYER_OUTLINE_STROKE_WEIGHT, miter_limit: 4., - join: kurbo::Join::Miter, - start_cap: kurbo::Cap::Butt, - end_cap: kurbo::Cap::Butt, + join: Join::Miter, + start_cap: Cap::Butt, + end_cap: Cap::Butt, dash_pattern: Default::default(), dash_offset: 0., }; @@ -913,7 +913,7 @@ impl GraphicElementRendered for VectorDataTable { if let Some(element_id) = element_id { let stroke_width = instance.style.stroke().as_ref().map_or(0., Stroke::weight); let filled = instance.style.fill() != &Fill::None; - let fill = |mut subpath: bezier_rs::Subpath<_>| { + let fill = |mut subpath: Subpath<_>| { if filled { subpath.set_closed(true); } @@ -953,7 +953,7 @@ impl GraphicElementRendered for VectorDataTable { for instance in self.instance_ref_iter() { let stroke_width = instance.instance.style.stroke().as_ref().map_or(0., Stroke::weight); let filled = instance.instance.style.fill() != &Fill::None; - let fill = |mut subpath: bezier_rs::Subpath<_>| { + let fill = |mut subpath: Subpath<_>| { if filled { subpath.set_closed(true); } @@ -1186,10 +1186,10 @@ impl GraphicElementRendered for RasterDataTable { if image.data.is_empty() { return; } - let image = vello::peniko::Image::new(image.to_flat_u8().0.into(), peniko::Format::Rgba8, image.width, image.height).with_extend(peniko::Extend::Repeat); + let image = peniko::Image::new(image.to_flat_u8().0.into(), peniko::Format::Rgba8, image.width, image.height).with_extend(peniko::Extend::Repeat); let transform = transform * *instance.transform * DAffine2::from_scale(1. / DVec2::new(image.width as f64, image.height as f64)); - scene.draw_image(&image, vello::kurbo::Affine::new(transform.to_cols_array())); + scene.draw_image(&image, kurbo::Affine::new(transform.to_cols_array())); } } @@ -1385,7 +1385,7 @@ impl GraphicElementRendered for GraphicElement { } /// Used to stop rust complaining about upstream traits adding display implementations to `Option`. This would not be an issue as we control that crate. -trait Primitive: core::fmt::Display {} +trait Primitive: std::fmt::Display {} impl Primitive for String {} impl Primitive for bool {} impl Primitive for f32 {} diff --git a/node-graph/gcore/src/graphic_element/renderer/quad.rs b/node-graph/gcore/src/graphic_element/renderer/quad.rs index 198e817f29..569f3e3d24 100644 --- a/node-graph/gcore/src/graphic_element/renderer/quad.rs +++ b/node-graph/gcore/src/graphic_element/renderer/quad.rs @@ -143,7 +143,7 @@ impl Quad { } } -impl core::ops::Mul for DAffine2 { +impl std::ops::Mul for DAffine2 { type Output = Quad; fn mul(self, rhs: Quad) -> Self::Output { diff --git a/node-graph/gcore/src/graphic_element/renderer/rect.rs b/node-graph/gcore/src/graphic_element/renderer/rect.rs index ace03dbfb9..b1de523b92 100644 --- a/node-graph/gcore/src/graphic_element/renderer/rect.rs +++ b/node-graph/gcore/src/graphic_element/renderer/rect.rs @@ -97,21 +97,21 @@ impl Rect { } } -impl core::ops::Mul for DAffine2 { - type Output = super::Quad; +impl std::ops::Mul for DAffine2 { + type Output = Quad; fn mul(self, rhs: Rect) -> Self::Output { - self * super::Quad::from_box(rhs.0) + self * Quad::from_box(rhs.0) } } -impl core::ops::Index for Rect { +impl std::ops::Index for Rect { type Output = DVec2; fn index(&self, index: usize) -> &Self::Output { &self.0[index] } } -impl core::ops::IndexMut for Rect { +impl std::ops::IndexMut for Rect { fn index_mut(&mut self, index: usize) -> &mut Self::Output { &mut self.0[index] } diff --git a/node-graph/gcore/src/instances.rs b/node-graph/gcore/src/instances.rs index 6a6918c713..2de0faf11c 100644 --- a/node-graph/gcore/src/instances.rs +++ b/node-graph/gcore/src/instances.rs @@ -128,8 +128,8 @@ impl Default for Instances { } } -impl core::hash::Hash for Instances { - fn hash(&self, state: &mut H) { +impl Hash for Instances { + fn hash(&self, state: &mut H) { for instance in &self.instance { instance.hash(state); } diff --git a/node-graph/gcore/src/lib.rs b/node-graph/gcore/src/lib.rs index 5e11bab5e7..4af81a6100 100644 --- a/node-graph/gcore/src/lib.rs +++ b/node-graph/gcore/src/lib.rs @@ -1,11 +1,9 @@ -extern crate alloc; - #[macro_use] extern crate log; -pub use crate as graphene_core; -pub use num_traits; +pub use crate as graphene_core; pub use ctor; +pub use num_traits; pub mod animation; pub mod consts; @@ -35,12 +33,12 @@ pub mod application_io; pub mod registry; pub use context::*; -use core::any::TypeId; -use core::future::Future; -use core::pin::Pin; pub use dyn_any::{StaticTypeSized, WasmNotSend, WasmNotSync}; pub use memo::MemoHash; pub use raster::Color; +use std::any::TypeId; +use std::future::Future; +use std::pin::Pin; pub use types::Cow; // pub trait Node: for<'n> NodeIO<'n> { @@ -54,11 +52,11 @@ pub trait Node<'i, Input> { fn reset(&self) {} /// Returns the name of the node for diagnostic purposes. fn node_name(&self) -> &'static str { - core::any::type_name::() + std::any::type_name::() } /// Serialize the node which is used for the `introspect` function which can retrieve values from monitor nodes. - fn serialize(&self) -> Option> { - log::warn!("Node::serialize not implemented for {}", core::any::type_name::()); + fn serialize(&self) -> Option> { + log::warn!("Node::serialize not implemented for {}", std::any::type_name::()); None } } @@ -75,13 +73,13 @@ where TypeId::of::() } fn input_type_name(&self) -> &'static str { - core::any::type_name::() + std::any::type_name::() } - fn output_type(&self) -> core::any::TypeId { + fn output_type(&self) -> TypeId { TypeId::of::<::Static>() } fn output_type_name(&self) -> &'static str { - core::any::type_name::() + std::any::type_name::() } fn to_node_io(&self, inputs: Vec) -> NodeIOTypes { NodeIOTypes { @@ -122,7 +120,7 @@ impl<'i, I: 'i, O: 'i, N: Node<'i, I, Output = O> + ?Sized> Node<'i, I> for Box< (**self).eval(input) } } -impl<'i, I: 'i, O: 'i, N: Node<'i, I, Output = O> + ?Sized> Node<'i, I> for alloc::sync::Arc { +impl<'i, I: 'i, O: 'i, N: Node<'i, I, Output = O> + ?Sized> Node<'i, I> for std::sync::Arc { type Output = O; fn eval(&'i self, input: I) -> O { (**self).eval(input) @@ -148,7 +146,7 @@ pub type WasmSurfaceHandle = application_io::SurfaceHandle; -pub trait InputAccessorSource<'a, T>: InputAccessorSourceIdentifier + core::fmt::Debug { +pub trait InputAccessorSource<'a, T>: InputAccessorSourceIdentifier + std::fmt::Debug { fn get_input(&'a self, index: usize) -> Option<&'a T>; fn set_input(&'a mut self, index: usize, value: T); } diff --git a/node-graph/gcore/src/logic.rs b/node-graph/gcore/src/logic.rs index 09db9bd77e..fb009bda68 100644 --- a/node-graph/gcore/src/logic.rs +++ b/node-graph/gcore/src/logic.rs @@ -3,15 +3,14 @@ use crate::{Color, Context, Ctx}; use glam::{DAffine2, DVec2}; #[node_macro::node(category("Debug"))] -fn log_to_console(_: impl Ctx, #[implementations(String, bool, f64, u32, u64, DVec2, VectorDataTable, DAffine2, Color, Option)] value: T) -> T { - #[cfg(not(target_arch = "spirv"))] +fn log_to_console(_: impl Ctx, #[implementations(String, bool, f64, u32, u64, DVec2, VectorDataTable, DAffine2, Color, Option)] value: T) -> T { // KEEP THIS `debug!()` - It acts as the output for the debug node itself log::debug!("{:#?}", value); value } #[node_macro::node(category("Text"))] -fn to_string(_: impl Ctx, #[implementations(String, bool, f64, u32, u64, DVec2, VectorDataTable, DAffine2)] value: T) -> String { +fn to_string(_: impl Ctx, #[implementations(String, bool, f64, u32, u64, DVec2, VectorDataTable, DAffine2)] value: T) -> String { format!("{:?}", value) } diff --git a/node-graph/gcore/src/memo.rs b/node-graph/gcore/src/memo.rs index 1f668e6a99..23e8ec38b3 100644 --- a/node-graph/gcore/src/memo.rs +++ b/node-graph/gcore/src/memo.rs @@ -1,9 +1,9 @@ use crate::{Node, WasmNotSend}; -use alloc::sync::Arc; -use core::future::Future; -use core::ops::Deref; use dyn_any::DynFuture; +use std::future::Future; use std::hash::DefaultHasher; +use std::ops::Deref; +use std::sync::Arc; use std::sync::Mutex; /// Caches the output of a given Node and acts as a proxy @@ -15,7 +15,7 @@ pub struct MemoNode { impl<'i, I: Hash + 'i, T: 'i + Clone + WasmNotSend, CachedNode: 'i> Node<'i, I> for MemoNode where CachedNode: for<'any_input> Node<'any_input, I>, - for<'a> >::Output: core::future::Future + WasmNotSend, + for<'a> >::Output: Future + WasmNotSend, { // TODO: This should return a reference to the cached cached_value // but that requires a lot of lifetime magic <- This was suggested by copilot but is pretty accurate xD @@ -63,7 +63,7 @@ pub struct ImpureMemoNode { impl<'i, I: 'i, T: 'i + Clone + WasmNotSend, CachedNode: 'i> Node<'i, I> for ImpureMemoNode where CachedNode: for<'any_input> Node<'any_input, I>, - for<'a> >::Output: core::future::Future + WasmNotSend, + for<'a> >::Output: Future + WasmNotSend, { // TODO: This should return a reference to the cached cached_value // but that requires a lot of lifetime magic <- This was suggested by copilot but is pretty accurate xD @@ -93,7 +93,7 @@ impl ImpureMemoNode { ImpureMemoNode { cache: Default::default(), node, - _phantom: core::marker::PhantomData, + _phantom: std::marker::PhantomData, } } } @@ -130,9 +130,9 @@ where }) } - fn serialize(&self) -> Option> { + fn serialize(&self) -> Option> { let io = self.io.lock().unwrap(); - (io).as_ref().map(|output| output.clone() as Arc) + (io).as_ref().map(|output| output.clone() as Arc) } } @@ -142,7 +142,7 @@ impl MonitorNode { } } -use core::hash::{Hash, Hasher}; +use std::hash::{Hash, Hasher}; #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Debug)] pub struct MemoHash { hash: u64, @@ -179,7 +179,7 @@ impl MemoHash { } fn calc_hash(data: &T) -> u64 { - let mut hasher = std::collections::hash_map::DefaultHasher::new(); + let mut hasher = DefaultHasher::new(); data.hash(&mut hasher); hasher.finish() } @@ -206,7 +206,7 @@ impl Hash for MemoHash { } } -impl core::ops::Deref for MemoHash { +impl Deref for MemoHash { type Target = T; fn deref(&self) -> &Self::Target { @@ -218,14 +218,14 @@ pub struct MemoHashGuard<'a, T: Hash> { inner: &'a mut MemoHash, } -impl core::ops::Drop for MemoHashGuard<'_, T> { +impl Drop for MemoHashGuard<'_, T> { fn drop(&mut self) { let hash = MemoHash::::calc_hash(&self.inner.value); self.inner.hash = hash; } } -impl core::ops::Deref for MemoHashGuard<'_, T> { +impl Deref for MemoHashGuard<'_, T> { type Target = T; fn deref(&self) -> &Self::Target { @@ -233,7 +233,7 @@ impl core::ops::Deref for MemoHashGuard<'_, T> { } } -impl core::ops::DerefMut for MemoHashGuard<'_, T> { +impl std::ops::DerefMut for MemoHashGuard<'_, T> { fn deref_mut(&mut self) -> &mut Self::Target { &mut self.inner.value } diff --git a/node-graph/gcore/src/ops.rs b/node-graph/gcore/src/ops.rs index 99d6b291d3..bce9715665 100644 --- a/node-graph/gcore/src/ops.rs +++ b/node-graph/gcore/src/ops.rs @@ -4,8 +4,6 @@ use crate::raster_types::{CPU, RasterDataTable}; use crate::registry::types::{Fraction, Percentage}; use crate::vector::style::GradientStops; use crate::{Color, Node}; -use core::marker::PhantomData; -use core::ops::{Add, Div, Mul, Rem, Sub}; use dyn_any::DynAny; use glam::{DVec2, IVec2, UVec2}; use math_parser::ast; @@ -13,9 +11,8 @@ use math_parser::context::{EvalContext, NothingMap, ValueProvider}; use math_parser::value::{Number, Value}; use num_traits::Pow; use rand::{Rng, SeedableRng}; - -#[cfg(target_arch = "spirv")] -use spirv_std::num_traits::float::Float; +use std::marker::PhantomData; +use std::ops::{Add, Div, Mul, Rem, Sub}; /// The struct that stores the context for the maths parser. /// This is currently just limited to supplying `a` and `b` until we add better node graph support and UI for variadic inputs. @@ -252,7 +249,7 @@ impl TangentInverse for f64 { if radians { self.atan() } else { self.atan().to_degrees() } } } -impl TangentInverse for glam::DVec2 { +impl TangentInverse for DVec2 { type Output = f64; fn atan(self, radians: bool) -> Self::Output { if radians { self.y.atan2(self.x) } else { self.y.atan2(self.x).to_degrees() } @@ -325,19 +322,19 @@ fn absolute_value(_: impl Ctx, #[implementations(f6 /// The minimum function (min) picks the smaller of two numbers. #[node_macro::node(category("Math: Numeric"))] -fn min(_: impl Ctx, #[implementations(f64, &f64, f32, &f32, u32, &u32, &str)] value: T, #[implementations(f64, &f64, f32, &f32, u32, &u32, &str)] other_value: T) -> T { +fn min(_: impl Ctx, #[implementations(f64, &f64, f32, &f32, u32, &u32, &str)] value: T, #[implementations(f64, &f64, f32, &f32, u32, &u32, &str)] other_value: T) -> T { if value < other_value { value } else { other_value } } /// The maximum function (max) picks the larger of two numbers. #[node_macro::node(category("Math: Numeric"))] -fn max(_: impl Ctx, #[implementations(f64, &f64, f32, &f32, u32, &u32, &str)] value: T, #[implementations(f64, &f64, f32, &f32, u32, &u32, &str)] other_value: T) -> T { +fn max(_: impl Ctx, #[implementations(f64, &f64, f32, &f32, u32, &u32, &str)] value: T, #[implementations(f64, &f64, f32, &f32, u32, &u32, &str)] other_value: T) -> T { if value > other_value { value } else { other_value } } /// The clamp function (clamp) restricts a number to a specified range between a minimum and maximum value. The minimum and maximum values are automatically swapped if they are reversed. #[node_macro::node(category("Math: Numeric"))] -fn clamp( +fn clamp( _: impl Ctx, #[implementations(f64, &f64, f32, &f32, u32, &u32, &str)] value: T, #[implementations(f64, &f64, f32, &f32, u32, &u32, &str)] min: T, @@ -355,7 +352,7 @@ fn clamp( /// The equality operation (==) compares two values and returns true if they are equal, or false if they are not. #[node_macro::node(category("Math: Logic"))] -fn equals, T>( +fn equals, T>( _: impl Ctx, #[implementations(f64, &f64, f32, &f32, u32, &u32, DVec2, &DVec2, &str)] value: T, #[implementations(f64, &f64, f32, &f32, u32, &u32, DVec2, &DVec2, &str)] other_value: U, @@ -365,7 +362,7 @@ fn equals, T>( /// The inequality operation (!=) compares two values and returns true if they are not equal, or false if they are. #[node_macro::node(category("Math: Logic"))] -fn not_equals, T>( +fn not_equals, T>( _: impl Ctx, #[implementations(f64, &f64, f32, &f32, u32, &u32, DVec2, &DVec2, &str)] value: T, #[implementations(f64, &f64, f32, &f32, u32, &u32, DVec2, &DVec2, &str)] other_value: U, @@ -376,7 +373,7 @@ fn not_equals, T>( /// The less-than operation (<) compares two values and returns true if the first value is less than the second, or false if it is not. /// If enabled with "Or Equal", the less-than-or-equal operation (<=) will be used instead. #[node_macro::node(category("Math: Logic"))] -fn less_than>( +fn less_than>( _: impl Ctx, #[implementations(f64, &f64, f32, &f32, u32, &u32)] value: T, #[implementations(f64, &f64, f32, &f32, u32, &u32)] other_value: T, @@ -388,7 +385,7 @@ fn less_than>( /// The greater-than operation (>) compares two values and returns true if the first value is greater than the second, or false if it is not. /// If enabled with "Or Equal", the greater-than-or-equal operation (>=) will be used instead. #[node_macro::node(category("Math: Logic"))] -fn greater_than>( +fn greater_than>( _: impl Ctx, #[implementations(f64, &f64, f32, &f32, u32, &u32)] value: T, #[implementations(f64, &f64, f32, &f32, u32, &u32)] other_value: T, @@ -566,7 +563,7 @@ where self.0.reset(); } - fn serialize(&self) -> Option> { + fn serialize(&self) -> Option> { self.0.serialize() } } @@ -586,7 +583,7 @@ impl<'i, N: for<'a> Node<'a, I> + Copy, I: 'i> Copy for TypeNode(PhantomData); impl IntoNode { pub const fn new() -> Self { - Self(core::marker::PhantomData) + Self(PhantomData) } } impl Default for IntoNode { @@ -598,7 +595,7 @@ impl<'input, I: 'input, O: 'input> Node<'input, I> for IntoNode where I: Into + Sync + Send, { - type Output = ::dyn_any::DynFuture<'input, O>; + type Output = dyn_any::DynFuture<'input, O>; #[inline] fn eval(&'input self, input: I) -> Self::Output { @@ -613,8 +610,8 @@ mod test { #[test] pub fn dot_product_function() { - let vector_a = glam::DVec2::new(1., 2.); - let vector_b = glam::DVec2::new(3., 4.); + let vector_a = DVec2::new(1., 2.); + let vector_b = DVec2::new(3., 4.); assert_eq!(dot_product((), vector_a, vector_b), 11.); } diff --git a/node-graph/gcore/src/raster.rs b/node-graph/gcore/src/raster.rs index 08bc69cee5..88219c9f81 100644 --- a/node-graph/gcore/src/raster.rs +++ b/node-graph/gcore/src/raster.rs @@ -5,18 +5,16 @@ use crate::raster_types::{CPU, RasterDataTable}; use crate::registry::types::Percentage; use crate::vector::VectorDataTable; use bytemuck::{Pod, Zeroable}; -use core::fmt::Debug; use glam::DVec2; +use std::fmt::Debug; #[cfg(target_arch = "spirv")] use spirv_std::num_traits::float::Float; pub mod adjustments; pub mod bbox; -#[cfg(not(target_arch = "spirv"))] pub mod brush_cache; pub mod color; -#[cfg(not(target_arch = "spirv"))] pub mod curve; pub mod discrete_srgb; @@ -30,9 +28,9 @@ pub trait Linear { fn lerp(self, other: Self, value: Self) -> Self where Self: Sized + Copy, - Self: core::ops::Sub, - Self: core::ops::Mul, - Self: core::ops::Add, + Self: std::ops::Sub, + Self: std::ops::Mul, + Self: std::ops::Add, { self + (other - self) * value } @@ -134,7 +132,7 @@ pub trait Pixel: Clone + Pod + Zeroable + Default { } fn byte_size() -> usize { - core::mem::size_of::() + size_of::() } } pub trait RGB: Pixel { diff --git a/node-graph/gcore/src/raster/adjustments.rs b/node-graph/gcore/src/raster/adjustments.rs index b020856a6b..1691bfa544 100644 --- a/node-graph/gcore/src/raster/adjustments.rs +++ b/node-graph/gcore/src/raster/adjustments.rs @@ -10,12 +10,9 @@ use crate::vector::VectorDataTable; use crate::vector::style::GradientStops; use crate::{Ctx, Node}; use crate::{GraphicElement, GraphicGroupTable}; -use core::cmp::Ordering; -use core::fmt::Debug; use dyn_any::DynAny; -#[cfg(feature = "serde")] -#[cfg(target_arch = "spirv")] -use spirv_std::num_traits::float::Float; +use std::cmp::Ordering; +use std::fmt::Debug; // TODO: Implement the following: // Color Balance @@ -183,8 +180,8 @@ impl BlendMode { } } -impl core::fmt::Display for BlendMode { - fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { +impl std::fmt::Display for BlendMode { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { // Normal group BlendMode::Normal => write!(f, "Normal"), @@ -346,7 +343,7 @@ fn brightness_contrast>( let brightness = brightness as f32 / 255.; let contrast = contrast as f32 / 100.; - let contrast = if contrast > 0. { (contrast * core::f32::consts::FRAC_PI_2 - 0.01).tan() } else { contrast }; + let contrast = if contrast > 0. { (contrast * std::f32::consts::FRAC_PI_2 - 0.01).tan() } else { contrast }; let offset = brightness * contrast + brightness - contrast / 2.; @@ -368,13 +365,13 @@ fn brightness_contrast>( y: [0., 130. + brightness * 51., 233. + brightness * 10., 255.].map(|x| x / 255.), }; let brightness_curve_solutions = brightness_curve_points.solve(); - let mut brightness_lut: [f32; WINDOW_SIZE] = core::array::from_fn(|i| { + let mut brightness_lut: [f32; WINDOW_SIZE] = std::array::from_fn(|i| { let x = i as f32 / (WINDOW_SIZE as f32 - 1.); brightness_curve_points.interpolate(x, &brightness_curve_solutions) }); // Special handling for when brightness is negative if brightness_is_negative { - brightness_lut = core::array::from_fn(|i| { + brightness_lut = std::array::from_fn(|i| { let mut x = i; while x > 1 && brightness_lut[x] > i as f32 / WINDOW_SIZE as f32 { x -= 1; @@ -393,7 +390,7 @@ fn brightness_contrast>( y: [0., 64. - contrast * 30., 192. + contrast * 30., 255.].map(|x| x / 255.), }; let contrast_curve_solutions = contrast_curve_points.solve(); - let contrast_lut: [f32; WINDOW_SIZE] = core::array::from_fn(|i| { + let contrast_lut: [f32; WINDOW_SIZE] = std::array::from_fn(|i| { let x = i as f32 / (WINDOW_SIZE as f32 - 1.); contrast_curve_points.interpolate(x, &contrast_curve_solutions) }); @@ -1419,7 +1416,7 @@ fn generate_curves(_: impl Ctx, curve: Curve anchor: [1.; 2], handles: [curve.last_handle, [0.; 2]], }; - for sample in curve.manipulator_groups.iter().chain(core::iter::once(&end)) { + for sample in curve.manipulator_groups.iter().chain(std::iter::once(&end)) { let [x0, y0, x1, y1, x2, y2, x3, y3] = [pos[0], pos[1], param[0], param[1], sample.handles[0][0], sample.handles[0][1], sample.anchor[0], sample.anchor[1]].map(f64::from); let bezier = Bezier::from_cubic_coordinates(x0, y0, x1, y1, x2, y2, x3, y3); @@ -1511,7 +1508,7 @@ mod test { pub struct FutureWrapperNode(T); impl<'i, T: 'i + Clone + Send> Node<'i, ()> for FutureWrapperNode { - type Output = Pin + 'i + Send>>; + type Output = Pin + 'i + Send>>; fn eval(&'i self, _input: ()) -> Self::Output { let value = self.0.clone(); Box::pin(async move { value }) diff --git a/node-graph/gcore/src/raster/bbox.rs b/node-graph/gcore/src/raster/bbox.rs index 133304bc26..f12ecef250 100644 --- a/node-graph/gcore/src/raster/bbox.rs +++ b/node-graph/gcore/src/raster/bbox.rs @@ -1,8 +1,7 @@ use dyn_any::DynAny; use glam::{DAffine2, DVec2}; -#[cfg_attr(not(target_arch = "spirv"), derive(Debug))] -#[derive(Clone, DynAny)] +#[derive(Clone, Debug, DynAny)] pub struct AxisAlignedBbox { pub start: DVec2, pub end: DVec2, @@ -60,8 +59,7 @@ impl From<(DVec2, DVec2)> for AxisAlignedBbox { } } -#[cfg_attr(not(target_arch = "spirv"), derive(Debug))] -#[derive(Clone)] +#[derive(Clone, Debug)] pub struct Bbox { pub top_left: DVec2, pub top_right: DVec2, diff --git a/node-graph/gcore/src/raster/brush_cache.rs b/node-graph/gcore/src/raster/brush_cache.rs index 2220d2501b..f5165c893d 100644 --- a/node-graph/gcore/src/raster/brush_cache.rs +++ b/node-graph/gcore/src/raster/brush_cache.rs @@ -3,9 +3,9 @@ use crate::raster_types::CPU; use crate::raster_types::Raster; use crate::vector::brush_stroke::BrushStroke; use crate::vector::brush_stroke::BrushStyle; -use core::hash::Hash; use dyn_any::DynAny; use std::collections::HashMap; +use std::hash::Hash; use std::sync::Arc; use std::sync::Mutex; @@ -53,7 +53,7 @@ impl BrushCacheImpl { // Take our previous blended image (and invalidate the cache). // Since we're about to replace our cache anyway, this saves a clone. - background = core::mem::take(&mut self.blended_image); + background = std::mem::take(&mut self.blended_image); // Check if the first non-blended stroke is an extension of the last one. let mut first_stroke_texture = Instance { @@ -70,7 +70,7 @@ impl BrushCacheImpl { let new_points = strokes[0].compute_blit_points(); let is_point_prefix = new_points.get(..prev_points.len()) == Some(&prev_points); if same_style && is_point_prefix { - first_stroke_texture = core::mem::take(&mut self.last_stroke_texture); + first_stroke_texture = std::mem::take(&mut self.last_stroke_texture); first_stroke_point_skip = prev_points.len(); } } @@ -93,7 +93,7 @@ impl BrushCacheImpl { impl Hash for BrushCacheImpl { // Zero hash. - fn hash(&self, _state: &mut H) {} + fn hash(&self, _state: &mut H) {} } #[derive(Clone, Debug, Default)] @@ -151,7 +151,7 @@ impl PartialEq for BrushCache { } impl Hash for BrushCache { - fn hash(&self, state: &mut H) { + fn hash(&self, state: &mut H) { self.inner.lock().unwrap().hash(state); } } diff --git a/node-graph/gcore/src/raster/color.rs b/node-graph/gcore/src/raster/color.rs index eeba91a019..485fc9a08b 100644 --- a/node-graph/gcore/src/raster/color.rs +++ b/node-graph/gcore/src/raster/color.rs @@ -1,14 +1,13 @@ use super::discrete_srgb::{float_to_srgb_u8, srgb_u8_to_float}; use super::{Alpha, AlphaMut, AssociatedAlpha, Luminance, LuminanceMut, Pixel, RGB, RGBMut, Rec709Primaries, SRGB}; use bytemuck::{Pod, Zeroable}; -use core::hash::Hash; use dyn_any::DynAny; use half::f16; #[cfg(target_arch = "spirv")] use spirv_std::num_traits::Euclid; -#[cfg(feature = "serde")] #[cfg(target_arch = "spirv")] use spirv_std::num_traits::float::Float; +use std::hash::Hash; #[repr(C)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] @@ -217,7 +216,7 @@ pub struct Color { #[allow(clippy::derived_hash_with_manual_eq)] impl Hash for Color { - fn hash(&self, state: &mut H) { + fn hash(&self, state: &mut H) { self.red.to_bits().hash(state); self.green.to_bits().hash(state); self.blue.to_bits().hash(state); diff --git a/node-graph/gcore/src/raster/curve.rs b/node-graph/gcore/src/raster/curve.rs index edf8a5a6e2..c060d67093 100644 --- a/node-graph/gcore/src/raster/curve.rs +++ b/node-graph/gcore/src/raster/curve.rs @@ -1,7 +1,7 @@ use super::{Channel, Linear, LuminanceMut}; use crate::Node; -use core::ops::{Add, Mul, Sub}; use dyn_any::{DynAny, StaticType, StaticTypeSized}; +use std::ops::{Add, Mul, Sub}; #[derive(Debug, Clone, PartialEq, DynAny, specta::Type)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] @@ -95,12 +95,7 @@ impl CubicSplines { // Gaussian elimination: forward elimination for row in 0..4 { let pivot_row_index = (row..4) - .max_by(|&a_row, &b_row| { - augmented_matrix[a_row][row] - .abs() - .partial_cmp(&augmented_matrix[b_row][row].abs()) - .unwrap_or(core::cmp::Ordering::Equal) - }) + .max_by(|&a_row, &b_row| augmented_matrix[a_row][row].abs().partial_cmp(&augmented_matrix[b_row][row].abs()).unwrap_or(std::cmp::Ordering::Equal)) .unwrap(); // Swap the current row with the row that has the largest pivot element diff --git a/node-graph/gcore/src/raster/discrete_srgb.rs b/node-graph/gcore/src/raster/discrete_srgb.rs index 13a06e30ab..28981e0976 100644 --- a/node-graph/gcore/src/raster/discrete_srgb.rs +++ b/node-graph/gcore/src/raster/discrete_srgb.rs @@ -69,7 +69,7 @@ pub fn float_to_srgb_u8(mut f: f32) -> u8 { // We clamped f to [0, 1], and the integer representations // of the positive finite non-NaN floats are monotonic. // This makes the later LUT lookup panicless. - unsafe { core::hint::unreachable_unchecked() } + unsafe { std::hint::unreachable_unchecked() } } // Compute a piecewise linear interpolation that is always diff --git a/node-graph/gcore/src/raster/image.rs b/node-graph/gcore/src/raster/image.rs index 36254461ad..d38dfefdab 100644 --- a/node-graph/gcore/src/raster/image.rs +++ b/node-graph/gcore/src/raster/image.rs @@ -1,15 +1,12 @@ -use crate::{ - AlphaBlending, - instances::{Instance, Instances}, - raster_types::Raster, -}; - use super::Color; use super::discrete_srgb::float_to_srgb_u8; -use alloc::vec::Vec; +use crate::AlphaBlending; +use crate::instances::{Instance, Instances}; +use crate::raster_types::Raster; use core::hash::{Hash, Hasher}; use dyn_any::{DynAny, StaticType}; use glam::{DAffine2, DVec2}; +use std::vec::Vec; #[cfg(feature = "serde")] mod base64_serde { @@ -56,7 +53,7 @@ pub struct Image { } impl Debug for Image

{ - fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { let length = self.data.len(); f.debug_struct("Image") .field("width", &self.width) @@ -203,7 +200,7 @@ where impl IntoIterator for Image

{ type Item = P; - type IntoIter = alloc::vec::IntoIter

; + type IntoIter = std::vec::IntoIter

; fn into_iter(self) -> Self::IntoIter { self.data.into_iter() } diff --git a/node-graph/gcore/src/registry.rs b/node-graph/gcore/src/registry.rs index 9a773cb51a..4a7cbdbff0 100644 --- a/node-graph/gcore/src/registry.rs +++ b/node-graph/gcore/src/registry.rs @@ -108,10 +108,10 @@ pub static NODE_REGISTRY: NodeRegistry = LazyLock::new(|| Mutex::new(HashMap::ne pub static NODE_METADATA: LazyLock>> = LazyLock::new(|| Mutex::new(HashMap::new())); #[cfg(not(target_arch = "wasm32"))] -pub type DynFuture<'n, T> = Pin + 'n + Send>>; +pub type DynFuture<'n, T> = Pin + 'n + Send>>; #[cfg(target_arch = "wasm32")] -pub type DynFuture<'n, T> = Pin + 'n>>; -pub type LocalFuture<'n, T> = Pin + 'n>>; +pub type DynFuture<'n, T> = Pin + 'n>>; +pub type LocalFuture<'n, T> = Pin + 'n>>; #[cfg(not(target_arch = "wasm32"))] pub type Any<'n> = Box + 'n + Send>; #[cfg(target_arch = "wasm32")] @@ -169,8 +169,8 @@ impl Drop for NodeContainer { } } -impl core::fmt::Debug for NodeContainer { - fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> std::fmt::Result { +impl std::fmt::Debug for NodeContainer { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("NodeContainer").finish() } } @@ -184,7 +184,7 @@ impl NodeContainer { #[cfg(feature = "dealloc_nodes")] unsafe fn dealloc_unchecked(&mut self) { unsafe { - std::mem::drop(Box::from_raw(self.node as *mut TypeErasedNode)); + drop(Box::from_raw(self.node as *mut TypeErasedNode)); } } } @@ -219,7 +219,7 @@ where self.node.reset(); } - fn serialize(&self) -> Option> { + fn serialize(&self) -> Option> { self.node.serialize() } } @@ -227,8 +227,8 @@ impl DowncastBothNode { pub const fn new(node: SharedNodeContainer) -> Self { Self { node, - _i: core::marker::PhantomData, - _o: core::marker::PhantomData, + _i: PhantomData, + _o: PhantomData, } } } @@ -252,7 +252,7 @@ where } #[inline(always)] - fn serialize(&self) -> Option> { + fn serialize(&self) -> Option> { self.node.serialize() } } @@ -271,14 +271,14 @@ pub struct DynAnyNode { impl<'input, I, O, N> Node<'input, Any<'input>> for DynAnyNode where - I: 'input + dyn_any::StaticType + WasmNotSend, - O: 'input + dyn_any::StaticType + WasmNotSend, + I: 'input + StaticType + WasmNotSend, + O: 'input + StaticType + WasmNotSend, N: 'input + Node<'input, I, Output = DynFuture<'input, O>>, { type Output = FutureAny<'input>; #[inline] fn eval(&'input self, input: Any<'input>) -> Self::Output { - let node_name = core::any::type_name::(); + let node_name = std::any::type_name::(); let output = |input| { let result = self.node.eval(input); async move { Box::new(result.await) as Any<'input> } @@ -293,21 +293,21 @@ where self.node.reset(); } - fn serialize(&self) -> Option> { + fn serialize(&self) -> Option> { self.node.serialize() } } impl<'input, I, O, N> DynAnyNode where - I: 'input + dyn_any::StaticType, - O: 'input + dyn_any::StaticType, + I: 'input + StaticType, + O: 'input + StaticType, N: 'input + Node<'input, I, Output = DynFuture<'input, O>>, { pub const fn new(node: N) -> Self { Self { node, - _i: core::marker::PhantomData, - _o: core::marker::PhantomData, + _i: PhantomData, + _o: PhantomData, } } } diff --git a/node-graph/gcore/src/structural.rs b/node-graph/gcore/src/structural.rs index 875315a620..b6488c573c 100644 --- a/node-graph/gcore/src/structural.rs +++ b/node-graph/gcore/src/structural.rs @@ -1,5 +1,5 @@ use crate::Node; -use core::marker::PhantomData; +use std::marker::PhantomData; /// This is how we can generically define composition of two nodes. /// This is done generically as shown: @@ -58,10 +58,10 @@ pub struct AsyncComposeNode { impl<'i, Input: 'static, First, Second> Node<'i, Input> for AsyncComposeNode where First: Node<'i, Input>, - First::Output: core::future::Future, - Second: Node<'i, <>::Output as core::future::Future>::Output> + 'i, + First::Output: Future, + Second: Node<'i, <>::Output as Future>::Output> + 'i, { - type Output = core::pin::Pin>::Output as core::future::Future>::Output>>::Output> + 'i>>; + type Output = std::pin::Pin>::Output as Future>::Output>>::Output> + 'i>>; fn eval(&'i self, input: Input) -> Self::Output { Box::pin(async move { let arg = self.first.eval(input).await; @@ -73,8 +73,8 @@ where impl<'i, First, Second, Input: 'i> AsyncComposeNode where First: Node<'i, Input>, - First::Output: core::future::Future, - Second: Node<'i, <>::Output as core::future::Future>::Output> + 'i, + First::Output: Future, + Second: Node<'i, <>::Output as Future>::Output> + 'i, { pub const fn new(first: First, second: Second) -> Self { AsyncComposeNode:: { first, second, phantom: PhantomData } @@ -97,8 +97,8 @@ pub trait AndThen<'i, Input: 'i>: Sized { fn and_then(self, second: Second) -> AsyncComposeNode where Self: Node<'i, Input>, - Self::Output: core::future::Future, - Second: Node<'i, <>::Output as core::future::Future>::Output> + 'i, + Self::Output: Future, + Second: Node<'i, <>::Output as Future>::Output> + 'i, { AsyncComposeNode::new(self, second) } diff --git a/node-graph/gcore/src/text/font_cache.rs b/node-graph/gcore/src/text/font_cache.rs index de7581a8c9..a872166fb3 100644 --- a/node-graph/gcore/src/text/font_cache.rs +++ b/node-graph/gcore/src/text/font_cache.rs @@ -61,8 +61,8 @@ impl FontCache { } } -impl core::hash::Hash for FontCache { - fn hash(&self, state: &mut H) { +impl std::hash::Hash for FontCache { + fn hash(&self, state: &mut H) { self.preview_urls.len().hash(state); self.preview_urls.iter().for_each(|(font, url)| { font.hash(state); diff --git a/node-graph/gcore/src/transform.rs b/node-graph/gcore/src/transform.rs index 72fcf795c7..ce21a10ca0 100644 --- a/node-graph/gcore/src/transform.rs +++ b/node-graph/gcore/src/transform.rs @@ -136,8 +136,8 @@ impl From<()> for Footprint { } } -impl core::hash::Hash for Footprint { - fn hash(&self, state: &mut H) { +impl std::hash::Hash for Footprint { + fn hash(&self, state: &mut H) { self.transform.to_cols_array().iter().for_each(|x| x.to_le_bytes().hash(state)); self.resolution.hash(state) } diff --git a/node-graph/gcore/src/types.rs b/node-graph/gcore/src/types.rs index 8bad9514c3..b7dd4c7e6b 100644 --- a/node-graph/gcore/src/types.rs +++ b/node-graph/gcore/src/types.rs @@ -1,4 +1,4 @@ -use core::any::TypeId; +use std::any::TypeId; pub use std::borrow::Cow; @@ -6,20 +6,20 @@ pub use std::borrow::Cow; macro_rules! concrete { ($type:ty) => { $crate::Type::Concrete($crate::TypeDescriptor { - id: Some(core::any::TypeId::of::<$type>()), - name: $crate::Cow::Borrowed(core::any::type_name::<$type>()), + id: Some(std::any::TypeId::of::<$type>()), + name: $crate::Cow::Borrowed(std::any::type_name::<$type>()), alias: None, - size: core::mem::size_of::<$type>(), - align: core::mem::align_of::<$type>(), + size: std::mem::size_of::<$type>(), + align: std::mem::align_of::<$type>(), }) }; ($type:ty, $name:ty) => { $crate::Type::Concrete($crate::TypeDescriptor { - id: Some(core::any::TypeId::of::<$type>()), - name: $crate::Cow::Borrowed(core::any::type_name::<$type>()), + id: Some(std::any::TypeId::of::<$type>()), + name: $crate::Cow::Borrowed(std::any::type_name::<$type>()), alias: Some($crate::Cow::Borrowed(stringify!($name))), - size: core::mem::size_of::<$type>(), - align: core::mem::align_of::<$type>(), + size: std::mem::size_of::<$type>(), + align: std::mem::align_of::<$type>(), }) }; } @@ -28,11 +28,11 @@ macro_rules! concrete { macro_rules! concrete_with_name { ($type:ty, $name:expr_2021) => { $crate::Type::Concrete($crate::TypeDescriptor { - id: Some(core::any::TypeId::of::<$type>()), + id: Some(std::any::TypeId::of::<$type>()), name: $crate::Cow::Borrowed($name), alias: None, - size: core::mem::size_of::<$type>(), - align: core::mem::align_of::<$type>(), + size: std::mem::size_of::<$type>(), + align: std::mem::align_of::<$type>(), }) }; } @@ -114,8 +114,8 @@ impl NodeIOTypes { } } -impl core::fmt::Debug for NodeIOTypes { - fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { +impl std::fmt::Debug for NodeIOTypes { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.write_fmt(format_args!( "node({}) → {}", [&self.call_argument].into_iter().chain(&self.inputs).map(|input| input.to_string()).collect::>().join(", "), @@ -141,7 +141,7 @@ fn migrate_type_descriptor_names<'de, D: serde::Deserializer<'de>>(deserializer: let name = String::deserialize(deserializer)?; let name = match name.as_str() { "f32" => "f64".to_string(), - "graphene_core::transform::Footprint" => "core::option::Option>".to_string(), + "graphene_core::transform::Footprint" => "std::option::Option>".to_string(), "graphene_core::graphic_element::GraphicGroup" => "graphene_core::instances::Instances".to_string(), "graphene_core::vector::vector_data::VectorData" => "graphene_core::instances::Instances".to_string(), "graphene_core::raster::image::ImageFrame" @@ -172,8 +172,8 @@ pub struct TypeDescriptor { pub align: usize, } -impl core::hash::Hash for TypeDescriptor { - fn hash(&self, state: &mut H) { +impl std::hash::Hash for TypeDescriptor { + fn hash(&self, state: &mut H) { self.name.hash(state); } } @@ -264,10 +264,10 @@ impl Type { pub fn new() -> Self { Self::Concrete(TypeDescriptor { id: Some(TypeId::of::()), - name: Cow::Borrowed(core::any::type_name::()), + name: Cow::Borrowed(std::any::type_name::()), alias: None, - size: core::mem::size_of::(), - align: core::mem::align_of::(), + size: size_of::(), + align: align_of::(), }) } @@ -318,8 +318,8 @@ fn format_type(ty: &str) -> String { .join("<") } -impl core::fmt::Debug for Type { - fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { +impl std::fmt::Debug for Type { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { let result = match self { Self::Generic(name) => name.to_string(), #[cfg(feature = "type_id_logging")] diff --git a/node-graph/gcore/src/uuid.rs b/node-graph/gcore/src/uuid.rs index 420f2388d9..3df5007e08 100644 --- a/node-graph/gcore/src/uuid.rs +++ b/node-graph/gcore/src/uuid.rs @@ -43,9 +43,9 @@ mod u64_string { } mod uuid_generation { - use core::cell::Cell; use rand_chacha::ChaCha20Rng; use rand_chacha::rand_core::{RngCore, SeedableRng}; + use std::cell::Cell; use std::sync::Mutex; static RNG: Mutex> = Mutex::new(None); @@ -79,8 +79,8 @@ impl NodeId { } } -impl core::fmt::Display for NodeId { - fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { +impl std::fmt::Display for NodeId { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{}", self.0) } } diff --git a/node-graph/gcore/src/value.rs b/node-graph/gcore/src/value.rs index cc7bc471f2..3c3ff94c74 100644 --- a/node-graph/gcore/src/value.rs +++ b/node-graph/gcore/src/value.rs @@ -1,6 +1,6 @@ use crate::Node; -use core::cell::{Cell, RefCell, RefMut}; -use core::marker::PhantomData; +use std::cell::{Cell, RefCell, RefMut}; +use std::marker::PhantomData; #[derive(Default, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)] pub struct IntNode; diff --git a/node-graph/gcore/src/vector/algorithms/bezpath_algorithms.rs b/node-graph/gcore/src/vector/algorithms/bezpath_algorithms.rs index 8a30d2c245..7dd6f11c4c 100644 --- a/node-graph/gcore/src/vector/algorithms/bezpath_algorithms.rs +++ b/node-graph/gcore/src/vector/algorithms/bezpath_algorithms.rs @@ -108,7 +108,7 @@ pub fn t_value_to_parametric(bezpath: &BezPath, t: f64, euclidian: bool, segment /// Finds the t value of point on the given path segment i.e fractional distance along the segment's total length. /// It uses a binary search to find the value `t` such that the ratio `length_up_to_t / total_length` approximates the input `distance`. -pub fn eval_pathseg_euclidean(path_segment: kurbo::PathSeg, distance: f64, accuracy: f64) -> f64 { +pub fn eval_pathseg_euclidean(path_segment: PathSeg, distance: f64, accuracy: f64) -> f64 { let mut low_t = 0.; let mut mid_t = 0.5; let mut high_t = 1.; @@ -139,7 +139,7 @@ pub fn eval_pathseg_euclidean(path_segment: kurbo::PathSeg, distance: f64, accur /// Converts from a bezpath (composed of multiple segments) to a point along a certain segment represented. /// The returned tuple represents the segment index and the `t` value along that segment. /// Both the input global `t` value and the output `t` value are in euclidean space, meaning there is a constant rate of change along the arc length. -fn global_euclidean_to_local_euclidean(bezpath: &kurbo::BezPath, global_t: f64, lengths: &[f64], total_length: f64) -> (usize, f64) { +fn global_euclidean_to_local_euclidean(bezpath: &BezPath, global_t: f64, lengths: &[f64], total_length: f64) -> (usize, f64) { let mut accumulator = 0.; for (index, length) in lengths.iter().enumerate() { let length_ratio = length / total_length; @@ -158,7 +158,7 @@ enum BezPathTValue { /// Convert a [BezPathTValue] to a parametric `(segment_index, t)` tuple. /// - Asserts that `t` values contained within the `SubpathTValue` argument lie in the range [0, 1]. -fn bezpath_t_value_to_parametric(bezpath: &kurbo::BezPath, t: BezPathTValue, precomputed_segments_length: Option<&[f64]>) -> (usize, f64) { +fn bezpath_t_value_to_parametric(bezpath: &BezPath, t: BezPathTValue, precomputed_segments_length: Option<&[f64]>) -> (usize, f64) { let segment_count = bezpath.segments().count(); assert!(segment_count >= 1); diff --git a/node-graph/gcore/src/vector/algorithms/instance.rs b/node-graph/gcore/src/vector/algorithms/instance.rs index cc32bd9ddc..dde9a9f422 100644 --- a/node-graph/gcore/src/vector/algorithms/instance.rs +++ b/node-graph/gcore/src/vector/algorithms/instance.rs @@ -109,7 +109,7 @@ mod test { pub struct FutureWrapperNode(T); impl<'i, I: Ctx, T: 'i + Clone + Send> Node<'i, I> for FutureWrapperNode { - type Output = Pin + 'i + Send>>; + type Output = Pin + 'i + Send>>; fn eval(&'i self, _input: I) -> Self::Output { let value = self.0.clone(); Box::pin(async move { value }) diff --git a/node-graph/gcore/src/vector/algorithms/offset_subpath.rs b/node-graph/gcore/src/vector/algorithms/offset_subpath.rs index daaf23e924..2041ebdefa 100644 --- a/node-graph/gcore/src/vector/algorithms/offset_subpath.rs +++ b/node-graph/gcore/src/vector/algorithms/offset_subpath.rs @@ -8,7 +8,7 @@ const CUBIC_TO_BEZPATH_ACCURACY: f64 = 1e-3; /// Constant used to determine if `f64`s are equivalent. pub const MAX_ABSOLUTE_DIFFERENCE: f64 = 1e-3; -fn segment_to_bezier(seg: kurbo::PathSeg) -> bezier_rs::Bezier { +fn segment_to_bezier(seg: kurbo::PathSeg) -> Bezier { match seg { kurbo::PathSeg::Line(line) => Bezier::from_linear_coordinates(line.p0.x, line.p0.y, line.p1.x, line.p1.y), kurbo::PathSeg::Quad(quad_bez) => Bezier::from_quadratic_coordinates(quad_bez.p0.x, quad_bez.p0.y, quad_bez.p1.x, quad_bez.p1.y, quad_bez.p1.x, quad_bez.p1.y), diff --git a/node-graph/gcore/src/vector/algorithms/poisson_disk.rs b/node-graph/gcore/src/vector/algorithms/poisson_disk.rs index e4faedce29..da42a486de 100644 --- a/node-graph/gcore/src/vector/algorithms/poisson_disk.rs +++ b/node-graph/gcore/src/vector/algorithms/poisson_disk.rs @@ -1,6 +1,6 @@ -use core::f64; use glam::DVec2; use std::collections::HashMap; +use std::f64; const DEEPEST_SUBDIVISION_LEVEL_BEFORE_DISCARDING: usize = 8; @@ -27,7 +27,7 @@ pub fn poisson_disk_sample( // - Dividing into an integer number of cells across the dartboard domain, to avoid wastefully throwing darts beyond the width and height of the dartboard domain // - Being fully covered by the radius around a dart thrown anywhere in its area, where the worst-case is a corner which has a distance of sqrt(2) to the opposite corner let greater_dimension = width.max(height); - let base_level_grid_size = greater_dimension / (greater_dimension * std::f64::consts::SQRT_2 / (diameter / 2.)).ceil(); + let base_level_grid_size = greater_dimension / (greater_dimension * f64::consts::SQRT_2 / (diameter / 2.)).ceil(); // Initialize the problem by including all base-level squares in the active list since they're all part of the yet-to-be-targetted dartboard domain let base_level = ActiveListLevel::new_filled(base_level_grid_size, offset, width, height, &point_in_shape_checker, &line_intersect_shape_checker); diff --git a/node-graph/gcore/src/vector/style.rs b/node-graph/gcore/src/vector/style.rs index 41deb52365..7a5783ac22 100644 --- a/node-graph/gcore/src/vector/style.rs +++ b/node-graph/gcore/src/vector/style.rs @@ -22,7 +22,7 @@ pub enum GradientType { pub struct GradientStops(Vec<(f64, Color)>); impl std::hash::Hash for GradientStops { - fn hash(&self, state: &mut H) { + fn hash(&self, state: &mut H) { self.0.len().hash(state); self.0.iter().for_each(|(position, color)| { position.to_bits().hash(state); @@ -146,8 +146,8 @@ impl Default for Gradient { } } -impl core::hash::Hash for Gradient { - fn hash(&self, state: &mut H) { +impl std::hash::Hash for Gradient { + fn hash(&self, state: &mut H) { self.stops.0.len().hash(state); [].iter() .chain(self.start.to_array().iter()) @@ -611,8 +611,8 @@ pub struct Stroke { pub paint_order: PaintOrder, } -impl core::hash::Hash for Stroke { - fn hash(&self, state: &mut H) { +impl std::hash::Hash for Stroke { + fn hash(&self, state: &mut H) { self.color.hash(state); self.weight.to_bits().hash(state); { @@ -850,8 +850,8 @@ pub struct PathStyle { fill: Fill, } -impl core::hash::Hash for PathStyle { - fn hash(&self, state: &mut H) { +impl std::hash::Hash for PathStyle { + fn hash(&self, state: &mut H) { self.stroke.hash(state); self.fill.hash(state); } diff --git a/node-graph/gcore/src/vector/vector_data.rs b/node-graph/gcore/src/vector/vector_data.rs index 379e442f43..3ab8706472 100644 --- a/node-graph/gcore/src/vector/vector_data.rs +++ b/node-graph/gcore/src/vector/vector_data.rs @@ -9,12 +9,12 @@ use crate::renderer::{ClickTargetType, FreePoint}; use crate::{AlphaBlending, Color, GraphicGroupTable}; pub use attributes::*; use bezier_rs::ManipulatorGroup; -use core::borrow::Borrow; use dyn_any::DynAny; use glam::{DAffine2, DVec2}; pub use indexed::VectorDataIndex; use kurbo::{Affine, Rect, Shape}; pub use modification::*; +use std::borrow::Borrow; use std::collections::HashMap; // TODO: Eventually remove this migration document upgrade code @@ -105,8 +105,8 @@ impl Default for VectorData { } } -impl core::hash::Hash for VectorData { - fn hash(&self, state: &mut H) { +impl std::hash::Hash for VectorData { + fn hash(&self, state: &mut H) { self.point_domain.hash(state); self.segment_domain.hash(state); self.region_domain.hash(state); diff --git a/node-graph/gcore/src/vector/vector_data/attributes.rs b/node-graph/gcore/src/vector/vector_data/attributes.rs index 8f71996c3e..205fb3a097 100644 --- a/node-graph/gcore/src/vector/vector_data/attributes.rs +++ b/node-graph/gcore/src/vector/vector_data/attributes.rs @@ -1,11 +1,11 @@ use crate::vector::misc::dvec2_to_point; use crate::vector::vector_data::{HandleId, VectorData}; use bezier_rs::{BezierHandles, ManipulatorGroup}; -use core::iter::zip; use dyn_any::DynAny; use glam::{DAffine2, DVec2}; use std::collections::HashMap; use std::hash::{Hash, Hasher}; +use std::iter::zip; /// A simple macro for creating strongly typed ids (to avoid confusion when passing around ids). macro_rules! create_ids { @@ -53,7 +53,7 @@ create_ids! { InstanceId, PointId, SegmentId, RegionId, StrokeId, FillId } #[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] pub struct NoHash(Option); -impl core::hash::Hasher for NoHash { +impl Hasher for NoHash { fn finish(&self) -> u64 { self.0.unwrap() } @@ -70,7 +70,7 @@ impl core::hash::Hasher for NoHash { #[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] pub struct NoHashBuilder; -impl core::hash::BuildHasher for NoHashBuilder { +impl std::hash::BuildHasher for NoHashBuilder { type Hasher = NoHash; fn build_hasher(&self) -> Self::Hasher { NoHash::default() @@ -86,8 +86,8 @@ pub struct PointDomain { pub(crate) position: Vec, } -impl core::hash::Hash for PointDomain { - fn hash(&self, state: &mut H) { +impl Hash for PointDomain { + fn hash(&self, state: &mut H) { self.id.hash(state); self.position.iter().for_each(|pos| pos.to_array().map(|v| v.to_bits()).hash(state)); } @@ -203,7 +203,7 @@ pub struct SegmentDomain { id: Vec, start_point: Vec, end_point: Vec, - handles: Vec, + handles: Vec, stroke: Vec, } @@ -293,7 +293,7 @@ impl SegmentDomain { self.end_point[segment_index] = new; } - pub fn handles(&self) -> &[bezier_rs::BezierHandles] { + pub fn handles(&self) -> &[BezierHandles] { &self.handles } @@ -301,7 +301,7 @@ impl SegmentDomain { &self.stroke } - pub(crate) fn push(&mut self, id: SegmentId, start: usize, end: usize, handles: bezier_rs::BezierHandles, stroke: StrokeId) { + pub(crate) fn push(&mut self, id: SegmentId, start: usize, end: usize, handles: BezierHandles, stroke: StrokeId) { debug_assert!(!self.id.contains(&id), "Tried to push an existing point to a point domain"); self.id.push(id); @@ -319,12 +319,12 @@ impl SegmentDomain { self.id.iter().copied().zip(self.end_point.iter_mut()) } - pub(crate) fn handles_mut(&mut self) -> impl Iterator { + pub(crate) fn handles_mut(&mut self) -> impl Iterator { let nested = self.id.iter().zip(&mut self.handles).zip(&self.start_point).zip(&self.end_point); nested.map(|(((&a, b), &c), &d)| (a, b, c, d)) } - pub(crate) fn handles_and_points_mut(&mut self) -> impl Iterator { + pub(crate) fn handles_and_points_mut(&mut self) -> impl Iterator { let nested = self.handles.iter_mut().zip(&mut self.start_point).zip(&mut self.end_point); nested.map(|((a, b), c)| (a, b, c)) } @@ -368,7 +368,7 @@ impl SegmentDomain { self.id.iter().position(|&check_id| check_id == id) } - fn resolve_range(&self, range: &core::ops::RangeInclusive) -> Option> { + fn resolve_range(&self, range: &std::ops::RangeInclusive) -> Option> { match (self.id_to_index(*range.start()), self.id_to_index(*range.end())) { (Some(start), Some(end)) if start.max(end) < self.handles.len().min(self.id.len()).min(self.start_point.len()).min(self.end_point.len()) => Some(start..=end), _ => { @@ -446,7 +446,7 @@ impl SegmentDomain { pub struct RegionDomain { #[serde(alias = "ids")] id: Vec, - segment_range: Vec>, + segment_range: Vec>, fill: Vec, } @@ -476,7 +476,7 @@ impl RegionDomain { /// Like [`Self::retain`] but also gives the function access to the segment range. /// /// Note that this function requires an allocation that `retain` avoids. - pub fn retain_with_region(&mut self, f: impl Fn(&RegionId, &core::ops::RangeInclusive) -> bool) { + pub fn retain_with_region(&mut self, f: impl Fn(&RegionId, &std::ops::RangeInclusive) -> bool) { let keep = self.id.iter().zip(self.segment_range.iter()).map(|(id, range)| f(id, range)).collect::>(); let mut iter = keep.iter().copied(); self.segment_range.retain(|_| iter.next().unwrap()); @@ -486,7 +486,7 @@ impl RegionDomain { self.id.retain(|_| iter.next().unwrap()); } - pub fn push(&mut self, id: RegionId, segment_range: core::ops::RangeInclusive, fill: FillId) { + pub fn push(&mut self, id: RegionId, segment_range: std::ops::RangeInclusive, fill: FillId) { if self.id.contains(&id) { warn!("Duplicate region"); return; @@ -504,7 +504,7 @@ impl RegionDomain { self.id.iter().copied().max_by(|a, b| a.0.cmp(&b.0)).map(|mut id| id.next_id()).unwrap_or(RegionId::ZERO) } - pub fn segment_range_mut(&mut self) -> impl Iterator)> { + pub fn segment_range_mut(&mut self) -> impl Iterator)> { self.id.iter().copied().zip(self.segment_range.iter_mut()) } @@ -516,7 +516,7 @@ impl RegionDomain { &self.id } - pub fn segment_range(&self) -> &[core::ops::RangeInclusive] { + pub fn segment_range(&self) -> &[std::ops::RangeInclusive] { &self.segment_range } @@ -545,7 +545,7 @@ impl RegionDomain { /// Iterates over regions in the domain. /// /// Tuple is: (id, segment_range, fill) - pub fn iter(&self) -> impl Iterator, FillId)> + '_ { + pub fn iter(&self) -> impl Iterator, FillId)> + '_ { let ids = self.id.iter().copied(); let segment_range = self.segment_range.iter().cloned(); let fill = self.fill.iter().copied(); @@ -643,7 +643,7 @@ impl FoundSubpath { impl VectorData { /// Construct a [`bezier_rs::Bezier`] curve spanning from the resolved position of the start and end points with the specified handles. - fn segment_to_bezier_with_index(&self, start: usize, end: usize, handles: bezier_rs::BezierHandles) -> bezier_rs::Bezier { + fn segment_to_bezier_with_index(&self, start: usize, end: usize, handles: BezierHandles) -> bezier_rs::Bezier { let start = self.point_domain.positions()[start]; let end = self.point_domain.positions()[end]; bezier_rs::Bezier { start, end, handles } @@ -752,15 +752,15 @@ impl VectorData { } /// Construct a [`bezier_rs::Bezier`] curve from an iterator of segments with (handles, start point, end point) independently of discontinuities. - pub fn subpath_from_segments_ignore_discontinuities(&self, segments: impl Iterator) -> Option> { + pub fn subpath_from_segments_ignore_discontinuities(&self, segments: impl Iterator) -> Option> { let mut first_point = None; let mut groups = Vec::new(); - let mut last: Option<(usize, bezier_rs::BezierHandles)> = None; + let mut last: Option<(usize, BezierHandles)> = None; for (handle, start, end) in segments { first_point = Some(first_point.unwrap_or(start)); - groups.push(bezier_rs::ManipulatorGroup { + groups.push(ManipulatorGroup { anchor: self.point_domain.positions()[start], in_handle: last.and_then(|(_, handle)| handle.end()), out_handle: handle.start(), @@ -776,7 +776,7 @@ impl VectorData { if closed { groups[0].in_handle = last_handle.end(); } else { - groups.push(bezier_rs::ManipulatorGroup { + groups.push(ManipulatorGroup { anchor: self.point_domain.positions()[end], in_handle: last_handle.end(), out_handle: None, @@ -789,10 +789,10 @@ impl VectorData { } /// Construct a [`bezier_rs::Bezier`] curve from an iterator of segments with (handles, start point, end point). Returns None if any ids are invalid or if the segments are not continuous. - fn subpath_from_segments(&self, segments: impl Iterator) -> Option> { + fn subpath_from_segments(&self, segments: impl Iterator) -> Option> { let mut first_point = None; let mut groups = Vec::new(); - let mut last: Option<(usize, bezier_rs::BezierHandles)> = None; + let mut last: Option<(usize, BezierHandles)> = None; for (handle, start, end) in segments { if last.is_some_and(|(previous_end, _)| previous_end != start) { @@ -801,7 +801,7 @@ impl VectorData { } first_point = Some(first_point.unwrap_or(start)); - groups.push(bezier_rs::ManipulatorGroup { + groups.push(ManipulatorGroup { anchor: self.point_domain.positions()[start], in_handle: last.and_then(|(_, handle)| handle.end()), out_handle: handle.start(), @@ -817,7 +817,7 @@ impl VectorData { if closed { groups[0].in_handle = last_handle.end(); } else { - groups.push(bezier_rs::ManipulatorGroup { + groups.push(ManipulatorGroup { anchor: self.point_domain.positions()[end], in_handle: last_handle.end(), out_handle: None, @@ -908,13 +908,13 @@ impl VectorData { }) } - /// Construct an iterator [`bezier_rs::ManipulatorGroup`] for stroke. - pub fn manipulator_groups(&self) -> impl Iterator> + '_ { + /// Construct an iterator [`ManipulatorGroup`] for stroke. + pub fn manipulator_groups(&self) -> impl Iterator> + '_ { self.stroke_bezier_paths().flat_map(|mut path| std::mem::take(path.manipulator_groups_mut())) } /// Get manipulator by id - pub fn manipulator_group_id(&self, id: impl Into) -> Option> { + pub fn manipulator_group_id(&self, id: impl Into) -> Option> { let id = id.into(); self.manipulator_groups().find(|group| group.id == id) } @@ -994,7 +994,7 @@ pub struct StrokePathIter<'a> { } impl Iterator for StrokePathIter<'_> { - type Item = (Vec>, bool); + type Item = (Vec>, bool); fn next(&mut self) -> Option { let current_start = if let Some((index, _)) = self.points.iter().enumerate().skip(self.skip).find(|(_, val)| val.connected() == 1) { @@ -1016,7 +1016,7 @@ impl Iterator for StrokePathIter<'_> { loop { let Some(val) = self.points[point_index].take_first() else { // Dead end - groups.push(bezier_rs::ManipulatorGroup { + groups.push(ManipulatorGroup { anchor: self.vector_data.point_domain.positions()[point_index], in_handle, out_handle: None, @@ -1035,7 +1035,7 @@ impl Iterator for StrokePathIter<'_> { } else { self.vector_data.segment_domain.end_point()[val.segment_index] }; - groups.push(bezier_rs::ManipulatorGroup { + groups.push(ManipulatorGroup { anchor: self.vector_data.point_domain.positions()[point_index], in_handle, out_handle: handles.start(), diff --git a/node-graph/gcore/src/vector/vector_data/modification.rs b/node-graph/gcore/src/vector/vector_data/modification.rs index 4e4ba3c5c7..d4f1b180b7 100644 --- a/node-graph/gcore/src/vector/vector_data/modification.rs +++ b/node-graph/gcore/src/vector/vector_data/modification.rs @@ -3,10 +3,10 @@ use crate::Ctx; use crate::instances::Instance; use crate::uuid::generate_uuid; use bezier_rs::BezierHandles; -use core::hash::BuildHasher; use dyn_any::DynAny; use kurbo::{BezPath, PathEl, Point}; use std::collections::{HashMap, HashSet}; +use std::hash::BuildHasher; /// Represents a procedural change to the [`PointDomain`] in [`VectorData`]. #[derive(Clone, Debug, Default, PartialEq)] @@ -260,7 +260,7 @@ pub struct RegionModification { add: Vec, remove: HashSet, #[serde(serialize_with = "serialize_hashmap", deserialize_with = "deserialize_hashmap")] - segment_range: HashMap>, + segment_range: HashMap>, #[serde(serialize_with = "serialize_hashmap", deserialize_with = "deserialize_hashmap")] fill: HashMap, } @@ -416,8 +416,8 @@ impl VectorModification { } } -impl core::hash::Hash for VectorModification { - fn hash(&self, state: &mut H) { +impl Hash for VectorModification { + fn hash(&self, state: &mut H) { generate_uuid().hash(state) } } diff --git a/node-graph/gcore/src/vector/vector_nodes.rs b/node-graph/gcore/src/vector/vector_nodes.rs index 79d768ff15..c2d53e2982 100644 --- a/node-graph/gcore/src/vector/vector_nodes.rs +++ b/node-graph/gcore/src/vector/vector_nodes.rs @@ -14,13 +14,13 @@ use crate::vector::style::{PaintOrder, StrokeAlign, StrokeCap, StrokeJoin}; use crate::vector::{FillId, PointDomain, RegionId}; use crate::{CloneVarArgs, Color, Context, Ctx, ExtractAll, GraphicElement, GraphicGroupTable, OwnedContextImpl}; use bezier_rs::{Join, ManipulatorGroup, Subpath}; -use core::f64::consts::PI; -use core::hash::{Hash, Hasher}; use glam::{DAffine2, DVec2}; use kurbo::{Affine, BezPath, DEFAULT_ACCURACY, ParamCurve, PathEl, PathSeg, Point, Shape}; use rand::{Rng, SeedableRng}; use std::collections::hash_map::DefaultHasher; +use std::f64::consts::PI; use std::f64::consts::TAU; +use std::hash::{Hash, Hasher}; /// Implemented for types that can be converted to an iterator of vector data. /// Used for the fill and stroke node so they can be used on VectorData or GraphicGroup @@ -1949,7 +1949,7 @@ mod test { pub struct FutureWrapperNode(T); impl<'i, T: 'i + Clone + Send> Node<'i, Footprint> for FutureWrapperNode { - type Output = Pin + 'i + Send>>; + type Output = Pin + 'i + Send>>; fn eval(&'i self, _input: Footprint) -> Self::Output { let value = self.0.clone(); Box::pin(async move { value }) @@ -2011,7 +2011,7 @@ mod test { // Test a VectorData with non-zero rotation let square = VectorData::from_subpath(Subpath::new_rect(DVec2::NEG_ONE, DVec2::ONE)); let mut square = VectorDataTable::new(square); - *square.get_mut(0).unwrap().transform *= DAffine2::from_angle(core::f64::consts::FRAC_PI_4); + *square.get_mut(0).unwrap().transform *= DAffine2::from_angle(std::f64::consts::FRAC_PI_4); let bounding_box = BoundingBoxNode { vector_data: FutureWrapperNode(square), } @@ -2111,7 +2111,7 @@ mod test { } #[track_caller] - fn contains_segment(vector: VectorData, target: bezier_rs::Bezier) { + fn contains_segment(vector: VectorData, target: Bezier) { let segments = vector.segment_bezier_iter().map(|x| x.1); let count = segments.filter(|bezier| bezier.abs_diff_eq(&target, 0.01) || bezier.reversed().abs_diff_eq(&target, 0.01)).count(); assert_eq!( @@ -2132,16 +2132,16 @@ mod test { assert_eq!(beveled.segment_domain.ids().len(), 8); // Segments - contains_segment(beveled.clone(), bezier_rs::Bezier::from_linear_dvec2(DVec2::new(5., 0.), DVec2::new(95., 0.))); - contains_segment(beveled.clone(), bezier_rs::Bezier::from_linear_dvec2(DVec2::new(5., 100.), DVec2::new(95., 100.))); - contains_segment(beveled.clone(), bezier_rs::Bezier::from_linear_dvec2(DVec2::new(0., 5.), DVec2::new(0., 95.))); - contains_segment(beveled.clone(), bezier_rs::Bezier::from_linear_dvec2(DVec2::new(100., 5.), DVec2::new(100., 95.))); + contains_segment(beveled.clone(), Bezier::from_linear_dvec2(DVec2::new(5., 0.), DVec2::new(95., 0.))); + contains_segment(beveled.clone(), Bezier::from_linear_dvec2(DVec2::new(5., 100.), DVec2::new(95., 100.))); + contains_segment(beveled.clone(), Bezier::from_linear_dvec2(DVec2::new(0., 5.), DVec2::new(0., 95.))); + contains_segment(beveled.clone(), Bezier::from_linear_dvec2(DVec2::new(100., 5.), DVec2::new(100., 95.))); // Joins - contains_segment(beveled.clone(), bezier_rs::Bezier::from_linear_dvec2(DVec2::new(5., 0.), DVec2::new(0., 5.))); - contains_segment(beveled.clone(), bezier_rs::Bezier::from_linear_dvec2(DVec2::new(95., 0.), DVec2::new(100., 5.))); - contains_segment(beveled.clone(), bezier_rs::Bezier::from_linear_dvec2(DVec2::new(100., 95.), DVec2::new(95., 100.))); - contains_segment(beveled.clone(), bezier_rs::Bezier::from_linear_dvec2(DVec2::new(5., 100.), DVec2::new(0., 95.))); + contains_segment(beveled.clone(), Bezier::from_linear_dvec2(DVec2::new(5., 0.), DVec2::new(0., 5.))); + contains_segment(beveled.clone(), Bezier::from_linear_dvec2(DVec2::new(95., 0.), DVec2::new(100., 5.))); + contains_segment(beveled.clone(), Bezier::from_linear_dvec2(DVec2::new(100., 95.), DVec2::new(95., 100.))); + contains_segment(beveled.clone(), Bezier::from_linear_dvec2(DVec2::new(5., 100.), DVec2::new(0., 95.))); } #[tokio::test] @@ -2155,12 +2155,12 @@ mod test { assert_eq!(beveled.segment_domain.ids().len(), 3); // Segments - contains_segment(beveled.clone(), bezier_rs::Bezier::from_linear_dvec2(DVec2::new(-5., 0.), DVec2::new(-100., 0.))); + contains_segment(beveled.clone(), Bezier::from_linear_dvec2(DVec2::new(-5., 0.), DVec2::new(-100., 0.))); let trimmed = curve.trim(bezier_rs::TValue::Euclidean(5. / curve.length(Some(0.00001))), bezier_rs::TValue::Parametric(1.)); contains_segment(beveled.clone(), trimmed); // Join - contains_segment(beveled.clone(), bezier_rs::Bezier::from_linear_dvec2(DVec2::new(-5., 0.), trimmed.start)); + contains_segment(beveled.clone(), Bezier::from_linear_dvec2(DVec2::new(-5., 0.), trimmed.start)); } #[tokio::test] @@ -2179,12 +2179,12 @@ mod test { assert_eq!(beveled.segment_domain.ids().len(), 3); // Segments - contains_segment(beveled.clone(), bezier_rs::Bezier::from_linear_dvec2(DVec2::new(-5., 0.), DVec2::new(-10., 0.))); + contains_segment(beveled.clone(), Bezier::from_linear_dvec2(DVec2::new(-5., 0.), DVec2::new(-10., 0.))); let trimmed = curve.trim(bezier_rs::TValue::Euclidean(5. / curve.length(Some(0.00001))), bezier_rs::TValue::Parametric(1.)); contains_segment(beveled.clone(), trimmed); // Join - contains_segment(beveled.clone(), bezier_rs::Bezier::from_linear_dvec2(DVec2::new(-5., 0.), trimmed.start)); + contains_segment(beveled.clone(), Bezier::from_linear_dvec2(DVec2::new(-5., 0.), trimmed.start)); } #[tokio::test] @@ -2197,13 +2197,13 @@ mod test { assert_eq!(beveled.segment_domain.ids().len(), 5); // Segments - contains_segment(beveled.clone(), bezier_rs::Bezier::from_linear_dvec2(DVec2::new(0., 0.), DVec2::new(50., 0.))); - contains_segment(beveled.clone(), bezier_rs::Bezier::from_linear_dvec2(DVec2::new(100., 50.), DVec2::new(100., 50.))); - contains_segment(beveled.clone(), bezier_rs::Bezier::from_linear_dvec2(DVec2::new(100., 50.), DVec2::new(50., 100.))); + contains_segment(beveled.clone(), Bezier::from_linear_dvec2(DVec2::new(0., 0.), DVec2::new(50., 0.))); + contains_segment(beveled.clone(), Bezier::from_linear_dvec2(DVec2::new(100., 50.), DVec2::new(100., 50.))); + contains_segment(beveled.clone(), Bezier::from_linear_dvec2(DVec2::new(100., 50.), DVec2::new(50., 100.))); // Joins - contains_segment(beveled.clone(), bezier_rs::Bezier::from_linear_dvec2(DVec2::new(50., 0.), DVec2::new(100., 50.))); - contains_segment(beveled.clone(), bezier_rs::Bezier::from_linear_dvec2(DVec2::new(100., 50.), DVec2::new(50., 100.))); + contains_segment(beveled.clone(), Bezier::from_linear_dvec2(DVec2::new(50., 0.), DVec2::new(100., 50.))); + contains_segment(beveled.clone(), Bezier::from_linear_dvec2(DVec2::new(100., 50.), DVec2::new(50., 100.))); } #[tokio::test] @@ -2218,11 +2218,11 @@ mod test { assert_eq!(beveled.segment_domain.ids().len(), 5); // Segments - contains_segment(beveled.clone(), bezier_rs::Bezier::from_linear_dvec2(DVec2::new(-100., 0.), DVec2::new(-5., 0.))); - contains_segment(beveled.clone(), bezier_rs::Bezier::from_linear_dvec2(DVec2::new(-5., 0.), DVec2::new(0., 0.))); + contains_segment(beveled.clone(), Bezier::from_linear_dvec2(DVec2::new(-100., 0.), DVec2::new(-5., 0.))); + contains_segment(beveled.clone(), Bezier::from_linear_dvec2(DVec2::new(-5., 0.), DVec2::new(0., 0.))); contains_segment(beveled.clone(), point); let [start, end] = curve.split(bezier_rs::TValue::Euclidean(5. / curve.length(Some(0.00001)))); - contains_segment(beveled.clone(), bezier_rs::Bezier::from_linear_dvec2(start.start, start.end)); + contains_segment(beveled.clone(), Bezier::from_linear_dvec2(start.start, start.end)); contains_segment(beveled.clone(), end); } } diff --git a/node-graph/graph-craft/src/document.rs b/node-graph/graph-craft/src/document.rs index 840985e453..821f2f3a31 100644 --- a/node-graph/graph-craft/src/document.rs +++ b/node-graph/graph-craft/src/document.rs @@ -147,7 +147,7 @@ pub struct DocumentNode { #[cfg_attr(feature = "serde", serde(default = "return_true"))] pub visible: bool, /// When two different proto nodes hash to the same value (e.g. two value nodes each containing `2_u32` or two multiply nodes that have the same node IDs as input), the duplicates are removed. - /// See [`crate::proto::ProtoNetwork::generate_stable_node_ids`] for details. + /// See [`ProtoNetwork::generate_stable_node_ids`] for details. /// However sometimes this is not desirable, for example in the case of a [`graphene_core::memo::MonitorNode`] that needs to be accessed outside of the graph. #[cfg_attr(feature = "serde", serde(default))] pub skip_deduplication: bool, @@ -602,7 +602,7 @@ pub struct OldDocumentNode { /// Metadata about the node including its position in the graph UI. Ensure the click target in the encapsulating network is updated when the node moves by using network.update_click_target(node_id). pub metadata: OldDocumentNodeMetadata, /// When two different proto nodes hash to the same value (e.g. two value nodes each containing `2_u32` or two multiply nodes that have the same node IDs as input), the duplicates are removed. - /// See [`crate::proto::ProtoNetwork::generate_stable_node_ids`] for details. + /// See [`ProtoNetwork::generate_stable_node_ids`] for details. /// However sometimes this is not desirable, for example in the case of a [`graphene_core::memo::MonitorNode`] that needs to be accessed outside of the graph. #[cfg_attr(feature = "serde", serde(default))] pub skip_deduplication: bool, @@ -710,8 +710,8 @@ pub struct NodeNetwork { pub scope_injections: FxHashMap, } -impl std::hash::Hash for NodeNetwork { - fn hash(&self, state: &mut H) { +impl Hash for NodeNetwork { + fn hash(&self, state: &mut H) { self.exports.hash(state); let mut nodes: Vec<_> = self.nodes.iter().collect(); nodes.sort_by_key(|(id, _)| *id); diff --git a/node-graph/graph-craft/src/proto.rs b/node-graph/graph-craft/src/proto.rs index bc3189e70b..771a0734bf 100644 --- a/node-graph/graph-craft/src/proto.rs +++ b/node-graph/graph-craft/src/proto.rs @@ -373,7 +373,7 @@ impl ProtoNetwork { (inwards_edges, id_map) } - /// Inserts a [`graphene_core::structural::ComposeNode`] for each node that has a [`ProtoNodeInput::Node`]. The compose node evaluates the first node, and then sends the result into the second node. + /// Inserts a [`structural::ComposeNode`] for each node that has a [`ProtoNodeInput::Node`]. The compose node evaluates the first node, and then sends the result into the second node. pub fn resolve_inputs(&mut self) -> Result<(), String> { // Perform topological sort once self.reorder_ids()?; @@ -542,7 +542,7 @@ pub enum GraphErrorType { InvalidImplementations { inputs: String, error_inputs: Vec> }, MultipleImplementations { inputs: String, valid: Vec }, } -impl core::fmt::Debug for GraphErrorType { +impl Debug for GraphErrorType { // TODO: format with the document graph context so the input index is the same as in the graph UI. fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { @@ -603,7 +603,7 @@ impl GraphError { } } } -impl core::fmt::Debug for GraphError { +impl Debug for GraphError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("NodeGraphError") .field("path", &self.node_path.iter().map(|id| id.0).collect::>()) diff --git a/node-graph/graphene-cli/src/main.rs b/node-graph/graphene-cli/src/main.rs index 9a932b4162..fc60a920d4 100644 --- a/node-graph/graphene-cli/src/main.rs +++ b/node-graph/graphene-cli/src/main.rs @@ -174,7 +174,7 @@ fn fix_nodes(network: &mut NodeNetwork) { if (proto_node_identifier.name.starts_with("graphene_core::ConstructLayerNode") || proto_node_identifier.name.starts_with("graphene_core::AddArtboardNode")) && node.inputs.len() < 3 => { - node.inputs.push(NodeInput::Reflection(graph_craft::document::DocumentNodeMetadata::DocumentNodePath)); + node.inputs.push(NodeInput::Reflection(DocumentNodeMetadata::DocumentNodePath)); } _ => {} } diff --git a/node-graph/gstd/src/vector.rs b/node-graph/gstd/src/vector.rs index 4fbf3a664c..1e84ed7a95 100644 --- a/node-graph/gstd/src/vector.rs +++ b/node-graph/gstd/src/vector.rs @@ -280,7 +280,7 @@ fn to_path(vector: &VectorData, transform: DAffine2) -> Vec, subpath: &bezier_rs::Subpath, transform: DAffine2) { +fn to_path_segments(path: &mut Vec, subpath: &Subpath, transform: DAffine2) { use path_bool::PathSegment; let mut global_start = None; let mut global_end = DVec2::ZERO; diff --git a/node-graph/interpreted-executor/src/node_registry.rs b/node-graph/interpreted-executor/src/node_registry.rs index 7b30c6c018..6ccfdf4296 100644 --- a/node-graph/interpreted-executor/src/node_registry.rs +++ b/node-graph/interpreted-executor/src/node_registry.rs @@ -1,5 +1,5 @@ use dyn_any::StaticType; -use glam::{DVec2, UVec2}; +use glam::{DVec2, IVec2, UVec2}; use graph_craft::document::value::RenderOutput; use graph_craft::proto::{NodeConstructor, TypeErasedBox}; use graphene_core::raster::color::Color; @@ -46,8 +46,8 @@ fn node_registry() -> HashMap, input: Context, fn_params: [Context => RasterDataTable]), async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => graphene_core::instances::Instances]), async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => String]), - async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => glam::IVec2]), - async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => glam::DVec2]), + async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => IVec2]), + async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => DVec2]), async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => bool]), async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => f64]), async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => u32]), @@ -57,7 +57,7 @@ fn node_registry() -> HashMap, input: Context, fn_params: [Context => BlendMode]), async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => graphene_std::transform::ReferencePoint]), async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => graphene_core::vector::misc::BooleanOperation]), - async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => Option]), + async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => Option]), async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => graphene_core::vector::style::Fill]), async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => graphene_core::vector::style::StrokeCap]), async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => graphene_core::vector::style::StrokeJoin]), @@ -67,7 +67,7 @@ fn node_registry() -> HashMap, input: Context, fn_params: [Context => graphene_core::vector::style::Gradient]), async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => graphene_core::vector::style::GradientStops]), async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => Vec]), - async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => graphene_core::Color]), + async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => Color]), async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => Box]), async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => graphene_std::vector::misc::CentroidType]), async_node!(graphene_core::memo::MemoNode<_, _>, input: Context, fn_params: [Context => Image]), @@ -77,8 +77,8 @@ fn node_registry() -> HashMap, input: Context, fn_params: [Context => Vec]), async_node!(graphene_core::memo::MemoNode<_, _>, input: Context, fn_params: [Context => Arc]), async_node!(graphene_core::memo::MemoNode<_, _>, input: Context, fn_params: [Context => WindowHandle]), - async_node!(graphene_core::memo::MemoNode<_, _>, input: Context, fn_params: [Context => Option]), - async_node!(graphene_core::memo::MemoNode<_, _>, input: Context, fn_params: [Context => wgpu_executor::WindowHandle]), + async_node!(graphene_core::memo::MemoNode<_, _>, input: Context, fn_params: [Context => Option]), + async_node!(graphene_core::memo::MemoNode<_, _>, input: Context, fn_params: [Context => WindowHandle]), async_node!(graphene_core::memo::MemoNode<_, _>, input: Context, fn_params: [Context => graphene_std::SurfaceFrame]), async_node!(graphene_core::memo::MemoNode<_, _>, input: UVec2, fn_params: [UVec2 => graphene_std::SurfaceFrame]), async_node!(graphene_core::memo::MemoNode<_, _>, input: Context, fn_params: [Context => f64]), @@ -108,7 +108,7 @@ fn node_registry() -> HashMap, input: Context, fn_params: [Context => wgpu_executor::WgpuSurface]), + async_node!(graphene_core::memo::MemoNode<_, _>, input: Context, fn_params: [Context => WgpuSurface]), #[cfg(feature = "gpu")] async_node!(graphene_core::memo::ImpureMemoNode<_, _, _>, input: Context, fn_params: [Context => RasterDataTable]), #[cfg(feature = "gpu")] @@ -122,7 +122,7 @@ fn node_registry() -> HashMap = DowncastBothNode::new(args[0].clone()); let node = >::new(editor_api); - let any: DynAnyNode = graphene_std::any::DynAnyNode::new(node); + let any: DynAnyNode = DynAnyNode::new(node); Box::new(any) as TypeErasedBox }) }, diff --git a/node-graph/interpreted-executor/src/util.rs b/node-graph/interpreted-executor/src/util.rs index c0244acecb..5d4e624a49 100644 --- a/node-graph/interpreted-executor/src/util.rs +++ b/node-graph/interpreted-executor/src/util.rs @@ -24,7 +24,7 @@ pub fn wrap_network_in_scope(mut network: NodeNetwork, editor_api: Arc syn::Result name.value(), - (_, name) => name.to_string().to_case(convert_case::Case::Title), + (_, name) => name.to_string().to_case(Case::Title), }) .collect(); @@ -510,7 +510,7 @@ fn generate_phantom_data<'a>(fn_generics: impl Iterator Result { +fn generate_register_node_impl(parsed: &ParsedNodeFn, field_names: &[&Ident], struct_name: &Ident, identifier: &TokenStream2) -> Result { if parsed.attributes.skip_impl { return Ok(quote!()); } @@ -625,7 +625,7 @@ struct LifetimeReplacer(&'static str); impl VisitMut for LifetimeReplacer { fn visit_lifetime_mut(&mut self, lifetime: &mut Lifetime) { - lifetime.ident = syn::Ident::new(self.0, lifetime.ident.span()); + lifetime.ident = Ident::new(self.0, lifetime.ident.span()); } fn visit_type_mut(&mut self, ty: &mut Type) { @@ -662,7 +662,7 @@ struct FilterUsedGenerics { } impl VisitMut for FilterUsedGenerics { - fn visit_lifetime_mut(&mut self, used_lifetime: &mut syn::Lifetime) { + fn visit_lifetime_mut(&mut self, used_lifetime: &mut Lifetime) { for (generic, used) in self.all.iter().zip(self.used.iter_mut()) { let crate::GenericParam::Lifetime(lifetime_param) = generic else { continue }; if used_lifetime == &lifetime_param.lifetime { diff --git a/node-graph/node-macro/src/derive_choice_type.rs b/node-graph/node-macro/src/derive_choice_type.rs index 86278c6622..14df0f246f 100644 --- a/node-graph/node-macro/src/derive_choice_type.rs +++ b/node-graph/node-macro/src/derive_choice_type.rs @@ -111,12 +111,8 @@ fn derive_enum(enum_attributes: &[Attribute], name: Ident, input: syn::DataEnum) }) .collect(); - let crate_name = proc_macro_crate::crate_name("graphene-core").map_err(|e| { - syn::Error::new( - proc_macro2::Span::call_site(), - format!("Failed to find location of graphene_core. Make sure it is imported as a dependency: {}", e), - ) - })?; + let crate_name = proc_macro_crate::crate_name("graphene-core") + .map_err(|e| syn::Error::new(Span::call_site(), format!("Failed to find location of graphene_core. Make sure it is imported as a dependency: {}", e)))?; let crate_name = match crate_name { proc_macro_crate::FoundCrate::Itself => quote!(crate), proc_macro_crate::FoundCrate::Name(name) => { @@ -144,19 +140,19 @@ fn derive_enum(enum_attributes: &[Attribute], name: Ident, input: syn::DataEnum) let docstring = match &variant.basic_item.description { Some(s) => { let s = s.trim(); - quote! { Some(::alloc::borrow::Cow::Borrowed(#s)) } + quote! { Some(::std::borrow::Cow::Borrowed(#s)) } } None => quote! { None }, }; let icon = match &variant.basic_item.icon { - Some(s) => quote! { Some(::alloc::borrow::Cow::Borrowed(#s)) }, + Some(s) => quote! { Some(::std::borrow::Cow::Borrowed(#s)) }, None => quote! { None }, }; quote! { ( #name::#vname, #crate_name::registry::VariantMetadata { - name: ::alloc::borrow::Cow::Borrowed(#vname_str), - label: ::alloc::borrow::Cow::Borrowed(#label), + name: ::std::borrow::Cow::Borrowed(#vname_str), + label: ::std::borrow::Cow::Borrowed(#label), docstring: #docstring, icon: #icon, } diff --git a/node-graph/node-macro/src/parsing.rs b/node-graph/node-macro/src/parsing.rs index 99e4c10af5..e49233363c 100644 --- a/node-graph/node-macro/src/parsing.rs +++ b/node-graph/node-macro/src/parsing.rs @@ -88,10 +88,10 @@ impl Parse for ParsedWidgetOverride { let lit: LitStr = input.parse()?; Ok(ParsedWidgetOverride::Custom(lit)) } - _ => Err(syn::Error::new(variant.span(), "Unknown ParsedWidgetOverride variant")), + _ => Err(Error::new(variant.span(), "Unknown ParsedWidgetOverride variant")), } } else { - Err(syn::Error::new(input.span(), "Expected ParsedWidgetOverride::")) + Err(Error::new(input.span(), "Expected ParsedWidgetOverride::")) } } } @@ -1214,7 +1214,7 @@ mod tests { let attr = quote!(category("Test")); // Use quote_spanned! to attach a specific span to the problematic part - let problem_span = proc_macro2::Span::call_site(); // You could create a custom span here if needed + let problem_span = Span::call_site(); // You could create a custom span here if needed let tuples = quote_spanned!(problem_span=> () ()); let input = quote! { fn test_node( diff --git a/node-graph/wgpu-executor/src/context.rs b/node-graph/wgpu-executor/src/context.rs index bc26f84872..7d0d81859c 100644 --- a/node-graph/wgpu-executor/src/context.rs +++ b/node-graph/wgpu-executor/src/context.rs @@ -16,7 +16,7 @@ impl Context { backends: wgpu::Backends::all(), ..Default::default() }; - let instance = wgpu::Instance::new(instance_descriptor); + let instance = Instance::new(instance_descriptor); let adapter_options = wgpu::RequestAdapterOptions { power_preference: wgpu::PowerPreference::HighPerformance, From ca5ca863ccd006fcf09b7f3f0eb30da721ca8bf8 Mon Sep 17 00:00:00 2001 From: Firestar99 Date: Sun, 22 Jun 2025 01:26:25 +0200 Subject: [PATCH 03/44] Unify feature dependencies with workspace dependencies (#2736) * graph-craft: fix direct wasm build * graph-craft: fix no serde feature failing to compile * graph-craft: make wgpu-executor properly optional * workspace: unify `image` formats in workspace * workspace: turn most dependencies into workspace deps, no actual changes * workspace: unify dependency features in workspace dep --- {frontend/wasm/.cargo => .cargo}/config.toml | 0 Cargo.lock | 1 - Cargo.toml | 63 ++++++++++++++----- editor/Cargo.toml | 27 +++----- frontend/src-tauri/Cargo.toml | 2 +- frontend/wasm/Cargo.toml | 16 ++--- libraries/bezier-rs/Cargo.toml | 2 +- libraries/dyn-any/derive/Cargo.toml | 8 +-- libraries/math-parser/Cargo.toml | 2 +- libraries/path-bool/Cargo.toml | 2 +- node-graph/gcore/Cargo.toml | 36 +++++------ node-graph/graph-craft/Cargo.toml | 23 +++---- node-graph/graph-craft/src/document.rs | 2 + node-graph/graph-craft/src/proto.rs | 6 +- .../graph-craft/src/wasm_application_io.rs | 31 ++++++--- node-graph/graphene-cli/Cargo.toml | 10 +-- node-graph/gstd/Cargo.toml | 30 ++++----- node-graph/gstd/src/wasm_application_io.rs | 1 + node-graph/interpreted-executor/Cargo.toml | 14 ++--- .../interpreted-executor/src/node_registry.rs | 1 + node-graph/node-macro/Cargo.toml | 4 +- node-graph/wgpu-executor/Cargo.toml | 13 ++-- 22 files changed, 151 insertions(+), 143 deletions(-) rename {frontend/wasm/.cargo => .cargo}/config.toml (100%) diff --git a/frontend/wasm/.cargo/config.toml b/.cargo/config.toml similarity index 100% rename from frontend/wasm/.cargo/config.toml rename to .cargo/config.toml diff --git a/Cargo.lock b/Cargo.lock index c39cb7752b..f995cdd48f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2263,7 +2263,6 @@ dependencies = [ "graph-craft", "graphene-std", "graphite-proc-macros", - "image", "interpreted-executor", "js-sys", "log", diff --git a/Cargo.toml b/Cargo.toml index b657a7aef2..981c1994df 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -31,14 +31,17 @@ resolver = "2" [workspace.dependencies] # Local dependencies -dyn-any = { path = "libraries/dyn-any", features = ["derive", "glam", "reqwest"] } -graphene-core = { path = "node-graph/gcore" } -graph-craft = { path = "node-graph/graph-craft", features = ["serde"] } -wgpu-executor = { path = "node-graph/wgpu-executor" } -bezier-rs = { path = "libraries/bezier-rs", features = ["dyn-any"] } -path-bool = { path = "libraries/path-bool", default-features = false } +bezier-rs = { path = "libraries/bezier-rs", features = ["dyn-any", "serde"] } +dyn-any = { path = "libraries/dyn-any", features = ["derive", "glam", "reqwest", "log-bad-types", "rc"] } math-parser = { path = "libraries/math-parser" } +path-bool = { path = "libraries/path-bool" } +graphene-core = { path = "node-graph/gcore", default-features = false } +graph-craft = { path = "node-graph/graph-craft", features = ["serde"] } +graphene-std = { path = "node-graph/gstd" } +interpreted-executor = { path = "node-graph/interpreted-executor" } node-macro = { path = "node-graph/node-macro" } +wgpu-executor = { path = "node-graph/wgpu-executor" } +graphite-proc-macros = { path = "proc-macros" } # Workspace dependencies rustc-hash = "2.0" @@ -56,30 +59,51 @@ convert_case = "0.7" derivative = "2.2" thiserror = "2" anyhow = "1.0" -proc-macro2 = "1" +proc-macro2 = { version = "1", features = [ "span-locations" ] } quote = "1.0" axum = "0.8" chrono = "0.4" ron = "0.8" fastnoise-lite = "1.1" -spirv-std = { git = "https://github.com/Rust-GPU/rust-gpu.git" } -wgpu = "23" +wgpu = { version = "23", features = [ + # We don't have wgpu on multiple threads (yet) https://github.com/gfx-rs/wgpu/blob/trunk/CHANGELOG.md#wgpu-types-now-send-sync-on-wasm + "fragile-send-sync-non-atomic-wasm", + "spirv", + "strict_asserts", +] } once_cell = "1.13" # Remove when `core::cell::LazyCell` () is stabilized in Rust 1.80 and we bump our MSRV wasm-bindgen = "=0.2.100" # NOTICE: ensure this stays in sync with the `wasm-bindgen-cli` version in `website/content/volunteer/guide/project-setup/_index.md`. We pin this version because wasm-bindgen upgrades may break various things. wasm-bindgen-futures = "0.4" js-sys = "=0.3.77" -web-sys = "=0.3.77" +web-sys = { version = "=0.3.77", features = [ + "Document", + "DomRect", + "Element", + "HtmlCanvasElement", + "CanvasRenderingContext2d", + "CanvasPattern", + "OffscreenCanvas", + "OffscreenCanvasRenderingContext2d", + "TextMetrics", + "Window", + "IdleRequestOptions", + "ImageData", + "Navigator", + "Gpu", + "HtmlImageElement", + "ImageBitmapRenderingContext", +] } winit = "0.29" url = "2.5" -tokio = { version = "1.29", features = ["fs", "io-std"] } +tokio = { version = "1.29", features = ["fs", "macros", "io-std", "rt"] } vello = { git = "https://github.com/linebender/vello.git", rev = "3275ec8" } # TODO switch back to stable when a release is made resvg = "0.44" usvg = "0.44" -rand = { version = "0.9", default-features = false } +rand = { version = "0.9", default-features = false, features = ["std_rng"] } rand_chacha = "0.9" -glam = { version = "0.29", default-features = false, features = ["serde"] } +glam = { version = "0.29", default-features = false, features = ["serde", "scalar-math", "debug-glam-assert"] } base64 = "0.22" -image = { version = "0.25", default-features = false, features = ["png"] } +image = { version = "0.25", default-features = false, features = ["png", "jpeg", "bmp"] } rustybuzz = "0.20" pretty_assertions = "1.4.1" fern = { version = "0.7", features = ["colored"] } @@ -94,11 +118,22 @@ specta = { version = "2.0.0-rc.22", features = [ syn = { version = "2.0", default-features = false, features = [ "full", "derive", + "parsing", + "printing", + "visit-mut", + "visit", + "clone-impls", + "extra-traits", + "proc-macro", ] } kurbo = { version = "0.11.0", features = ["serde"] } petgraph = { version = "0.7.1", default-features = false, features = [ "graphmap", ] } +half = { version = "2.4.1", default-features = false, features = ["bytemuck"] } +tinyvec = { version = "1" } +criterion = { version = "0.5", features = ["html_reports"] } +iai-callgrind = { version = "0.12.3" } [profile.dev] opt-level = 1 diff --git a/editor/Cargo.toml b/editor/Cargo.toml index 9b1c3d75cd..9044653374 100644 --- a/editor/Cargo.toml +++ b/editor/Cargo.toml @@ -25,12 +25,12 @@ ron = ["dep:ron"] [dependencies] # Local dependencies -graphite-proc-macros = { path = "../proc-macros" } -graph-craft = { path = "../node-graph/graph-craft" } -interpreted-executor = { path = "../node-graph/interpreted-executor", features = [ +graphite-proc-macros = { workspace = true } +graph-craft = { workspace = true } +interpreted-executor = { workspace = true, features = [ "serde", ] } -graphene-std = { path = "../node-graph/gstd", features = ["serde"] } +graphene-std = { workspace = true, features = ["serde"] } # Workspace dependencies js-sys = { workspace = true } @@ -41,31 +41,20 @@ serde = { workspace = true } serde_json = { workspace = true } bezier-rs = { workspace = true } futures = { workspace = true } -glam = { workspace = true, features = ["serde", "debug-glam-assert"] } +glam = { workspace = true } derivative = { workspace = true } specta = { workspace = true } -image = { workspace = true, features = ["bmp", "png"] } dyn-any = { workspace = true } num_enum = { workspace = true } usvg = { workspace = true } once_cell = { workspace = true } -web-sys = { workspace = true, features = [ - "Document", - "DomRect", - "Element", - "HtmlCanvasElement", - "CanvasRenderingContext2d", - "CanvasPattern", - "OffscreenCanvas", - "OffscreenCanvasRenderingContext2d", - "TextMetrics", -] } +web-sys = { workspace = true } # Required dependencies spin = "0.9.8" # Optional local dependencies -wgpu-executor = { path = "../node-graph/wgpu-executor", optional = true } +wgpu-executor = { workspace = true, optional = true } # Optional workspace dependencies wasm-bindgen = { workspace = true, optional = true } @@ -76,7 +65,7 @@ ron = { workspace = true, optional = true } # Workspace dependencies env_logger = { workspace = true } futures = { workspace = true } -tokio = { workspace = true, features = ["rt", "macros"] } +tokio = { workspace = true } [lints.rust] # TODO: figure out why we check these features when they do not exist diff --git a/frontend/src-tauri/Cargo.toml b/frontend/src-tauri/Cargo.toml index b3107ce1b9..c2095e3d87 100644 --- a/frontend/src-tauri/Cargo.toml +++ b/frontend/src-tauri/Cargo.toml @@ -29,7 +29,7 @@ graphite-editor = { path = "../../editor", features = [ # Workspace dependencies axum = { workspace = true } chrono = { workspace = true } -tokio = { workspace = true, features = ["macros", "rt"] } +tokio = { workspace = true } ron = { workspace = true } log = { workspace = true } fern = { workspace = true } diff --git a/frontend/wasm/Cargo.toml b/frontend/wasm/Cargo.toml index 98280c9759..96bdd5a64f 100644 --- a/frontend/wasm/Cargo.toml +++ b/frontend/wasm/Cargo.toml @@ -29,24 +29,16 @@ editor = { path = "../../editor", package = "graphite-editor", features = [ # Workspace dependencies graph-craft = { workspace = true } log = { workspace = true } -graphene-core = { workspace = true } -serde = { workspace = true, features = ["derive"] } +graphene-core = { workspace = true, features = ["wasm"] } +serde = { workspace = true } wasm-bindgen = { workspace = true } serde-wasm-bindgen = { workspace = true } js-sys = { workspace = true } wasm-bindgen-futures = { workspace = true } glam = { workspace = true } math-parser = { workspace = true } -wgpu = { workspace = true, features = [ - "fragile-send-sync-non-atomic-wasm", -] } # We don't have wgpu on multiple threads (yet) https://github.com/gfx-rs/wgpu/blob/trunk/CHANGELOG.md#wgpu-types-now-send-sync-on-wasm -web-sys = { workspace = true, features = [ - "Window", - "CanvasRenderingContext2d", - "Document", - "HtmlCanvasElement", - "IdleRequestOptions", -] } +wgpu = { workspace = true } +web-sys = { workspace = true } [package.metadata.wasm-pack.profile.dev] wasm-opt = false diff --git a/libraries/bezier-rs/Cargo.toml b/libraries/bezier-rs/Cargo.toml index 6bb36c7321..ec9d6499f7 100644 --- a/libraries/bezier-rs/Cargo.toml +++ b/libraries/bezier-rs/Cargo.toml @@ -15,7 +15,7 @@ documentation = "https://graphite.rs/libraries/bezier-rs/" [dependencies] # Required dependencies -glam = { workspace = true, features = ["serde"] } +glam = { workspace = true } # Optional local dependencies dyn-any = { version = "0.3.0", path = "../dyn-any", optional = true } diff --git a/libraries/dyn-any/derive/Cargo.toml b/libraries/dyn-any/derive/Cargo.toml index 4e5de00304..12cbdd225c 100644 --- a/libraries/dyn-any/derive/Cargo.toml +++ b/libraries/dyn-any/derive/Cargo.toml @@ -17,13 +17,7 @@ proc-macro = true # Workspace dependencies proc-macro2 = { workspace = true } quote = { workspace = true } -syn = { workspace = true, default-features = false, features = [ - "derive", - "parsing", - "proc-macro", - "printing", - "clone-impls", -] } +syn = { workspace = true } [dev-dependencies] # Local dependencies diff --git a/libraries/math-parser/Cargo.toml b/libraries/math-parser/Cargo.toml index b84da885f6..999631ff3e 100644 --- a/libraries/math-parser/Cargo.toml +++ b/libraries/math-parser/Cargo.toml @@ -15,7 +15,7 @@ lazy_static = "1.5" num-complex = "0.4" [dev-dependencies] -criterion = "0.5" +criterion = { workspace = true } [[bench]] name = "bench" diff --git a/libraries/path-bool/Cargo.toml b/libraries/path-bool/Cargo.toml index 40a779c566..d85de28d26 100644 --- a/libraries/path-bool/Cargo.toml +++ b/libraries/path-bool/Cargo.toml @@ -35,7 +35,7 @@ resvg = "0.44" image = "0.25" # Required dependencies -criterion = { version = "0.5", features = ["html_reports"] } +criterion = { workspace = true } # Benchmarks [[bench]] diff --git a/node-graph/gcore/Cargo.toml b/node-graph/gcore/Cargo.toml index 9afddb0520..0ca48c3501 100644 --- a/node-graph/gcore/Cargo.toml +++ b/node-graph/gcore/Cargo.toml @@ -24,50 +24,42 @@ serde = [ ] [dependencies] +# Local dependencies +math-parser = { workspace = true } + # Workspace dependencies -bytemuck = { workspace = true, features = ["derive"] } +bytemuck = { workspace = true } node-macro = { workspace = true } num-derive = { workspace = true } -num-traits = { workspace = true, default-features = false, features = ["i128"] } +num-traits = { workspace = true } usvg = { workspace = true } -rand = { workspace = true, default-features = false, features = ["std_rng"] } -glam = { workspace = true, default-features = false, features = [ - "scalar-math", -] } +rand = { workspace = true } +glam = { workspace = true } serde_json = { workspace = true } -petgraph = { workspace = true, default-features = false, features = [ - "graphmap", -] } +petgraph = { workspace = true } rustc-hash = { workspace = true } -math-parser = { path = "../../libraries/math-parser" } dyn-any = { workspace = true } ctor = { workspace = true } rand_chacha = { workspace = true } bezier-rs = { workspace = true } specta = { workspace = true } rustybuzz = { workspace = true } -image = { workspace = true, default-features = false, features = [ - "png", -] } - -# Required dependencies -half = { version = "2.4.1", default-features = false, features = ["bytemuck"] } -tinyvec = { version = "1" } +image = { workspace = true } +half = { workspace = true } +tinyvec = { workspace = true } kurbo = { workspace = true } log = { workspace = true } # Optional workspace dependencies -serde = { workspace = true, optional = true, features = ["derive"] } +serde = { workspace = true, optional = true } base64 = { workspace = true, optional = true } vello = { workspace = true, optional = true } wgpu = { workspace = true, optional = true } -web-sys = { workspace = true, optional = true, features = [ - "HtmlCanvasElement", -] } +web-sys = { workspace = true, optional = true } [dev-dependencies] # Workspace dependencies -tokio = { workspace = true, features = ["rt", "macros"] } +tokio = { workspace = true } serde_json = { workspace = true } [lints.rust] diff --git a/node-graph/graph-craft/Cargo.toml b/node-graph/graph-craft/Cargo.toml index 71e7180948..e56eb72402 100644 --- a/node-graph/graph-craft/Cargo.toml +++ b/node-graph/graph-craft/Cargo.toml @@ -8,21 +8,17 @@ license = "MIT OR Apache-2.0" default = ["dealloc_nodes"] serde = ["dep:serde", "graphene-core/serde", "glam/serde", "bezier-rs/serde"] dealloc_nodes = ["graphene-core/dealloc_nodes"] -wgpu = [] +wgpu = ["wgpu-executor"] tokio = ["dep:tokio"] wayland = [] loading = ["serde_json", "serde"] [dependencies] # Local dependencies -dyn-any = { path = "../../libraries/dyn-any", features = [ - "log-bad-types", - "rc", - "glam", -] } +dyn-any = { workspace = true } +graphene-core = { workspace = true } # Workspace dependencies -graphene-core = { workspace = true } log = { workspace = true } glam = { workspace = true } bezier-rs = { workspace = true } @@ -30,16 +26,19 @@ specta = { workspace = true } rustc-hash = { workspace = true } url = { workspace = true } reqwest = { workspace = true } -wgpu-executor = { workspace = true } # Optional workspace dependencies +wgpu-executor = { workspace = true, optional = true } serde = { workspace = true, optional = true } tokio = { workspace = true, optional = true } serde_json = { workspace = true, optional = true } # Workspace dependencies [target.'cfg(target_arch = "wasm32")'.dependencies] -web-sys = { workspace = true } +web-sys = { workspace = true, features = [ + "Navigator", + "Gpu", +] } js-sys = { workspace = true } wasm-bindgen = { workspace = true } @@ -50,10 +49,8 @@ winit = { workspace = true } # Workspace dependencies graph-craft = { workspace = true, features = ["loading"] } pretty_assertions = { workspace = true } - -# Required dependencies -criterion = { version = "0.5", features = ["html_reports"] } -iai-callgrind = { version = "0.12.3" } +criterion = { workspace = true } +iai-callgrind = { workspace = true } # Benchmarks [[bench]] diff --git a/node-graph/graph-craft/src/document.rs b/node-graph/graph-craft/src/document.rs index 821f2f3a31..0a400de958 100644 --- a/node-graph/graph-craft/src/document.rs +++ b/node-graph/graph-craft/src/document.rs @@ -676,10 +676,12 @@ fn migrate_layer_to_merge<'de, D: serde::Deserializer<'de>>(deserializer: D) -> Ok(s) } // TODO: Eventually remove this document upgrade code +#[cfg(feature = "serde")] fn default_import_metadata() -> (NodeId, IVec2) { (NodeId::new(), IVec2::new(-25, -4)) } // TODO: Eventually remove this document upgrade code +#[cfg(feature = "serde")] fn default_export_metadata() -> (NodeId, IVec2) { (NodeId::new(), IVec2::new(8, -4)) } diff --git a/node-graph/graph-craft/src/proto.rs b/node-graph/graph-craft/src/proto.rs index 771a0734bf..7c5d0f590b 100644 --- a/node-graph/graph-craft/src/proto.rs +++ b/node-graph/graph-craft/src/proto.rs @@ -532,7 +532,8 @@ impl ProtoNetwork { Ok(()) } } -#[derive(Clone, PartialEq, serde::Serialize, serde::Deserialize)] +#[derive(Clone, PartialEq)] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub enum GraphErrorType { NodeNotFound(NodeId), InputNodeNotFound(NodeId), @@ -588,7 +589,8 @@ impl Debug for GraphErrorType { } } } -#[derive(Clone, PartialEq, serde::Serialize, serde::Deserialize)] +#[derive(Clone, PartialEq)] +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub struct GraphError { pub node_path: Vec, pub identifier: Cow<'static, str>, diff --git a/node-graph/graph-craft/src/wasm_application_io.rs b/node-graph/graph-craft/src/wasm_application_io.rs index 8f579fc4ca..4a8f4cbedd 100644 --- a/node-graph/graph-craft/src/wasm_application_io.rs +++ b/node-graph/graph-craft/src/wasm_application_io.rs @@ -1,5 +1,4 @@ use dyn_any::StaticType; -use graphene_core::application_io::SurfaceHandleFrame; use graphene_core::application_io::{ApplicationError, ApplicationIo, ResourceFuture, SurfaceHandle, SurfaceId}; #[cfg(target_arch = "wasm32")] use js_sys::{Object, Reflect}; @@ -7,6 +6,7 @@ use std::collections::HashMap; use std::sync::Arc; #[cfg(target_arch = "wasm32")] use std::sync::atomic::AtomicU64; +use std::sync::atomic::Ordering; #[cfg(feature = "tokio")] use tokio::io::AsyncReadExt; #[cfg(target_arch = "wasm32")] @@ -17,6 +17,7 @@ use wasm_bindgen::JsValue; use web_sys::HtmlCanvasElement; #[cfg(target_arch = "wasm32")] use web_sys::window; +#[cfg(feature = "wgpu")] use wgpu_executor::WgpuExecutor; #[derive(Debug)] @@ -76,7 +77,7 @@ pub fn wgpu_available() -> Option { } } - match WGPU_AVAILABLE.load(::std::sync::atomic::Ordering::SeqCst) { + match WGPU_AVAILABLE.load(Ordering::SeqCst) { -1 => None, 0 => Some(false), _ => Some(true), @@ -85,7 +86,7 @@ pub fn wgpu_available() -> Option { impl WasmApplicationIo { pub async fn new() -> Self { - #[cfg(target_arch = "wasm32")] + #[cfg(all(feature = "wgpu", target_arch = "wasm32"))] let executor = if let Some(gpu) = web_sys::window().map(|w| w.navigator().gpu()) { let request_adapter = || { let request_adapter = js_sys::Reflect::get(&gpu, &wasm_bindgen::JsValue::from_str("requestAdapter")).ok()?; @@ -101,9 +102,14 @@ impl WasmApplicationIo { None }; - #[cfg(not(target_arch = "wasm32"))] + #[cfg(all(feature = "wgpu", not(target_arch = "wasm32")))] let executor = WgpuExecutor::new().await; - WGPU_AVAILABLE.store(executor.is_some() as i8, ::std::sync::atomic::Ordering::SeqCst); + + #[cfg(not(feature = "wgpu"))] + let wgpu_available = false; + #[cfg(feature = "wgpu")] + let wgpu_available = executor.is_some(); + WGPU_AVAILABLE.store(wgpu_available as i8, Ordering::SeqCst); let mut io = Self { #[cfg(target_arch = "wasm32")] @@ -121,9 +127,14 @@ impl WasmApplicationIo { } pub async fn new_offscreen() -> Self { + #[cfg(feature = "wgpu")] let executor = WgpuExecutor::new().await; - WGPU_AVAILABLE.store(executor.is_some() as i8, ::std::sync::atomic::Ordering::SeqCst); + #[cfg(not(feature = "wgpu"))] + let wgpu_available = false; + #[cfg(feature = "wgpu")] + let wgpu_available = executor.is_some(); + WGPU_AVAILABLE.store(wgpu_available as i8, Ordering::SeqCst); // Always enable wgpu when running with Tauri let mut io = Self { @@ -175,7 +186,7 @@ impl ApplicationIo for WasmApplicationIo { let document = window().expect("should have a window in this context").document().expect("window should have a document"); let canvas: HtmlCanvasElement = document.create_element("canvas")?.dyn_into::()?; - let id = self.ids.fetch_add(1, std::sync::atomic::Ordering::SeqCst); + let id = self.ids.fetch_add(1, Ordering::SeqCst); // store the canvas in the global scope so it doesn't get garbage collected let window = window().expect("should have a window in this context"); let window = Object::from(window); @@ -299,8 +310,10 @@ impl ApplicationIo for WasmApplicationIo { } } +#[cfg(feature = "wgpu")] pub type WasmSurfaceHandle = SurfaceHandle; -pub type WasmSurfaceHandleFrame = SurfaceHandleFrame; +#[cfg(feature = "wgpu")] +pub type WasmSurfaceHandleFrame = graphene_core::application_io::SurfaceHandleFrame; #[derive(Clone, Debug, PartialEq, Hash, specta::Type)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] @@ -330,6 +343,6 @@ impl Default for EditorPreferences { } } -unsafe impl dyn_any::StaticType for EditorPreferences { +unsafe impl StaticType for EditorPreferences { type Static = EditorPreferences; } diff --git a/node-graph/graphene-cli/Cargo.toml b/node-graph/graphene-cli/Cargo.toml index 87e0e679f8..16bb7b4a77 100644 --- a/node-graph/graphene-cli/Cargo.toml +++ b/node-graph/graphene-cli/Cargo.toml @@ -20,18 +20,18 @@ gpu = [ [dependencies] # Local dependencies -graphene-std = { path = "../gstd", features = ["serde"] } -interpreted-executor = { path = "../interpreted-executor" } +graphene-core = { workspace = true } +graphene-std = { workspace = true, features = ["serde"] } +interpreted-executor = { workspace = true } +graph-craft = { workspace = true, features = ["loading"] } # Workspace dependencies log = { workspace = true } -graph-craft = { workspace = true, features = ["loading"] } -graphene-core = { workspace = true } futures = { workspace = true } fern = { workspace = true } chrono = { workspace = true } wgpu = { workspace = true } -tokio = { workspace = true, features = ["macros", "rt-multi-thread"] } +tokio = { workspace = true, features = ["rt-multi-thread"] } # Required dependencies clap = { version = "4.5.31", features = ["cargo", "derive"] } diff --git a/node-graph/gstd/Cargo.toml b/node-graph/gstd/Cargo.toml index 80fd05a1f8..f5fec67b78 100644 --- a/node-graph/gstd/Cargo.toml +++ b/node-graph/gstd/Cargo.toml @@ -19,39 +19,33 @@ wayland = ["graph-craft/wayland"] [dependencies] # Local dependencies -dyn-any = { path = "../../libraries/dyn-any", features = ["derive", "reqwest"] } -graph-craft = { path = "../graph-craft", features = ["serde"] } -wgpu-executor = { path = "../wgpu-executor" } -graphene-core = { path = "../gcore", default-features = false, features = ["serde"] } +dyn-any = { workspace = true } +graph-craft = { workspace = true, features = ["serde"] } +wgpu-executor = { workspace = true } +graphene-core = { workspace = true, features = ["serde"] } # Workspace dependencies fastnoise-lite = { workspace = true } log = { workspace = true } -bezier-rs = { workspace = true, features = ["serde"] } -path-bool = { workspace = true, features = ["parsing"] } -glam = { workspace = true, features = ["serde"] } +bezier-rs = { workspace = true } +path-bool = { workspace = true } +glam = { workspace = true } node-macro = { workspace = true } reqwest = { workspace = true } futures = { workspace = true } usvg = { workspace = true } rand_chacha = { workspace = true } -rand = { workspace = true, default-features = false, features = [ - "alloc", - "small_rng", -] } +rand = { workspace = true } bytemuck = { workspace = true } -image = { workspace = true, default-features = false, features = [ - "png", - "jpeg", -] } +image = { workspace = true } # Optional workspace dependencies base64 = { workspace = true, optional = true } wasm-bindgen = { workspace = true, optional = true } wasm-bindgen-futures = { workspace = true, optional = true } -tokio = { workspace = true, optional = true, features = ["fs", "io-std"] } +tokio = { workspace = true, optional = true } vello = { workspace = true, optional = true } -serde = { workspace = true, optional = true, features = ["derive"] } +serde = { workspace = true, optional = true } web-sys = { workspace = true, optional = true, features = [ "Window", "CanvasRenderingContext2d", @@ -68,4 +62,4 @@ web-sys = { workspace = true, optional = true, features = [ ndarray = "0.16.1" [dev-dependencies] -tokio = { workspace = true, features = ["macros"] } +tokio = { workspace = true } diff --git a/node-graph/gstd/src/wasm_application_io.rs b/node-graph/gstd/src/wasm_application_io.rs index 265247118e..94cc29b9fc 100644 --- a/node-graph/gstd/src/wasm_application_io.rs +++ b/node-graph/gstd/src/wasm_application_io.rs @@ -27,6 +27,7 @@ use wasm_bindgen::JsCast; #[cfg(target_arch = "wasm32")] use web_sys::{CanvasRenderingContext2d, HtmlCanvasElement}; +#[cfg(feature = "wgpu")] #[node_macro::node(category("Debug: GPU"))] async fn create_surface<'a: 'n>(_: impl Ctx, editor: &'a WasmEditorApi) -> Arc { Arc::new(editor.application_io.as_ref().unwrap().create_window()) diff --git a/node-graph/interpreted-executor/Cargo.toml b/node-graph/interpreted-executor/Cargo.toml index 03c70e9e82..b4f059a24e 100644 --- a/node-graph/interpreted-executor/Cargo.toml +++ b/node-graph/interpreted-executor/Cargo.toml @@ -11,13 +11,13 @@ gpu = ["graphene-std/gpu", "graphene-std/wgpu"] [dependencies] # Local dependencies -graphene-std = { path = "../gstd", features = ["serde"] } -graph-craft = { path = "../graph-craft" } -wgpu-executor = { path = "../wgpu-executor" } +graphene-std = { workspace = true, features = ["serde"] } +graph-craft = { workspace = true } +wgpu-executor = { workspace = true } +graphene-core = { workspace = true } +dyn-any = { workspace = true } # Workspace dependencies -graphene-core = { workspace = true } -dyn-any = { workspace = true, features = ["log-bad-types", "glam"] } log = { workspace = true } glam = { workspace = true } futures = { workspace = true } @@ -29,9 +29,7 @@ serde = { workspace = true, optional = true } [dev-dependencies] # Workspace dependencies graph-craft = { workspace = true, features = ["loading"] } - -# Required dependencies -criterion = { version = "0.5", features = ["html_reports"]} +criterion = { workspace = true } # Benchmarks [[bench]] diff --git a/node-graph/interpreted-executor/src/node_registry.rs b/node-graph/interpreted-executor/src/node_registry.rs index 6ccfdf4296..6059e24e6e 100644 --- a/node-graph/interpreted-executor/src/node_registry.rs +++ b/node-graph/interpreted-executor/src/node_registry.rs @@ -75,6 +75,7 @@ fn node_registry() -> HashMap, input: Context, fn_params: [Context => RasterDataTable]), async_node!(graphene_core::memo::MemoNode<_, _>, input: Context, fn_params: [Context => GraphicGroupTable]), async_node!(graphene_core::memo::MemoNode<_, _>, input: Context, fn_params: [Context => Vec]), + #[cfg(feature = "gpu")] async_node!(graphene_core::memo::MemoNode<_, _>, input: Context, fn_params: [Context => Arc]), async_node!(graphene_core::memo::MemoNode<_, _>, input: Context, fn_params: [Context => WindowHandle]), async_node!(graphene_core::memo::MemoNode<_, _>, input: Context, fn_params: [Context => Option]), diff --git a/node-graph/node-macro/Cargo.toml b/node-graph/node-macro/Cargo.toml index 2356bcb2bb..b63ce4927d 100644 --- a/node-graph/node-macro/Cargo.toml +++ b/node-graph/node-macro/Cargo.toml @@ -15,8 +15,8 @@ proc-macro = true [dependencies] # Workspace dependencies -syn = { workspace = true, features = [ "extra-traits", "full", "printing", "parsing", "clone-impls", "proc-macro", "visit-mut", "visit"] } -proc-macro2 = { workspace = true, features = [ "span-locations" ] } +syn = { workspace = true } +proc-macro2 = { workspace = true } quote = { workspace = true } convert_case = { workspace = true } diff --git a/node-graph/wgpu-executor/Cargo.toml b/node-graph/wgpu-executor/Cargo.toml index ecbfc7bcb1..6480c056aa 100644 --- a/node-graph/wgpu-executor/Cargo.toml +++ b/node-graph/wgpu-executor/Cargo.toml @@ -10,17 +10,16 @@ profiling = [] passthrough = [] [dependencies] -# Workspace dependencies +# Local dependencies graphene-core = { workspace = true, features = ["wgpu"] } -dyn-any = { workspace = true, features = ["log-bad-types", "rc", "glam"] } +dyn-any = { workspace = true } node-macro = { workspace = true } + +# Workspace dependencies glam = { workspace = true } anyhow = { workspace = true } -wgpu = { workspace = true, features = [ - "spirv", - "strict_asserts", -] } +wgpu = { workspace = true } futures = { workspace = true } -web-sys = { workspace = true, features = ["HtmlCanvasElement"] } +web-sys = { workspace = true } winit = { workspace = true } vello = { workspace = true } From e520c21b662926b0a9f911671b8f11f74619c203 Mon Sep 17 00:00:00 2001 From: Firestar99 Date: Sun, 22 Jun 2025 01:52:47 +0200 Subject: [PATCH 04/44] Remove the `serde` feature and instead just always require it (#2737) workspace: remove feature `serde`, always require it instead --- Cargo.lock | 1 - Cargo.toml | 6 +- editor/Cargo.toml | 6 +- node-graph/gcore/Cargo.toml | 10 +- node-graph/gcore/src/animation.rs | 3 +- node-graph/gcore/src/application_io.rs | 6 +- node-graph/gcore/src/graphic_element.rs | 18 +-- .../gcore/src/graphic_element/renderer.rs | 3 +- node-graph/gcore/src/memo.rs | 2 - node-graph/gcore/src/ops.rs | 3 +- node-graph/gcore/src/raster.rs | 2 - node-graph/gcore/src/raster/adjustments.rs | 33 ++--- node-graph/gcore/src/raster/brush_cache.rs | 14 +-- node-graph/gcore/src/raster/color.rs | 12 +- node-graph/gcore/src/raster/curve.rs | 6 +- node-graph/gcore/src/raster/image.rs | 26 ++-- node-graph/gcore/src/transform.rs | 6 +- node-graph/gcore/src/types.rs | 11 +- node-graph/gcore/src/vector/brush_stroke.rs | 9 +- node-graph/gcore/src/vector/vector_data.rs | 15 +-- .../src/vector/vector_data/attributes.rs | 11 +- .../src/vector/vector_data/modification.rs | 12 +- node-graph/graph-craft/Cargo.toml | 5 +- node-graph/graph-craft/src/document.rs | 113 +++++++----------- node-graph/graph-craft/src/document/value.rs | 27 ++--- node-graph/graph-craft/src/imaginate_input.rs | 21 ++-- node-graph/graph-craft/src/proto.rs | 19 +-- .../graph-craft/src/wasm_application_io.rs | 3 +- node-graph/graphene-cli/Cargo.toml | 2 +- node-graph/gstd/Cargo.toml | 5 +- node-graph/gstd/src/imaginate.rs | 30 ++--- node-graph/gstd/src/raster.rs | 2 - node-graph/interpreted-executor/Cargo.toml | 7 +- .../src/dynamic_executor.rs | 9 +- 34 files changed, 161 insertions(+), 297 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f995cdd48f..92b87cd829 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2221,7 +2221,6 @@ dependencies = [ "rand 0.9.0", "rand_chacha 0.9.0", "reqwest", - "serde", "tokio", "usvg", "vello", diff --git a/Cargo.toml b/Cargo.toml index 981c1994df..959f200bf3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,8 +35,8 @@ bezier-rs = { path = "libraries/bezier-rs", features = ["dyn-any", "serde"] } dyn-any = { path = "libraries/dyn-any", features = ["derive", "glam", "reqwest", "log-bad-types", "rc"] } math-parser = { path = "libraries/math-parser" } path-bool = { path = "libraries/path-bool" } -graphene-core = { path = "node-graph/gcore", default-features = false } -graph-craft = { path = "node-graph/graph-craft", features = ["serde"] } +graphene-core = { path = "node-graph/gcore" } +graph-craft = { path = "node-graph/graph-craft" } graphene-std = { path = "node-graph/gstd" } interpreted-executor = { path = "node-graph/interpreted-executor" } node-macro = { path = "node-graph/node-macro" } @@ -130,7 +130,7 @@ kurbo = { version = "0.11.0", features = ["serde"] } petgraph = { version = "0.7.1", default-features = false, features = [ "graphmap", ] } -half = { version = "2.4.1", default-features = false, features = ["bytemuck"] } +half = { version = "2.4.1", default-features = false, features = ["bytemuck", "serde"] } tinyvec = { version = "1" } criterion = { version = "0.5", features = ["html_reports"] } iai-callgrind = { version = "0.12.3" } diff --git a/editor/Cargo.toml b/editor/Cargo.toml index 9044653374..78791a1a91 100644 --- a/editor/Cargo.toml +++ b/editor/Cargo.toml @@ -27,10 +27,8 @@ ron = ["dep:ron"] # Local dependencies graphite-proc-macros = { workspace = true } graph-craft = { workspace = true } -interpreted-executor = { workspace = true, features = [ - "serde", -] } -graphene-std = { workspace = true, features = ["serde"] } +interpreted-executor = { workspace = true } +graphene-std = { workspace = true } # Workspace dependencies js-sys = { workspace = true } diff --git a/node-graph/gcore/Cargo.toml b/node-graph/gcore/Cargo.toml index 0ca48c3501..e1a004237c 100644 --- a/node-graph/gcore/Cargo.toml +++ b/node-graph/gcore/Cargo.toml @@ -14,14 +14,6 @@ wasm = ["web-sys"] wgpu = ["dep:wgpu"] vello = ["dep:vello", "bezier-rs/kurbo", "wgpu"] dealloc_nodes = [] -serde = [ - "dep:serde", - "glam/serde", - "bezier-rs/serde", - "bezier-rs/serde", - "half/serde", - "base64", -] [dependencies] # Local dependencies @@ -49,10 +41,10 @@ half = { workspace = true } tinyvec = { workspace = true } kurbo = { workspace = true } log = { workspace = true } +base64 = { workspace = true } # Optional workspace dependencies serde = { workspace = true, optional = true } -base64 = { workspace = true, optional = true } vello = { workspace = true, optional = true } wgpu = { workspace = true, optional = true } web-sys = { workspace = true, optional = true } diff --git a/node-graph/gcore/src/animation.rs b/node-graph/gcore/src/animation.rs index 97e20dc6a2..fe992397bc 100644 --- a/node-graph/gcore/src/animation.rs +++ b/node-graph/gcore/src/animation.rs @@ -2,8 +2,7 @@ use crate::{Ctx, ExtractAnimationTime, ExtractTime}; const DAY: f64 = 1000. * 3600. * 24.; -#[derive(Debug, Clone, Copy, PartialEq, Eq, dyn_any::DynAny, Default, Hash, node_macro::ChoiceType)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Debug, Clone, Copy, PartialEq, Eq, dyn_any::DynAny, Default, Hash, node_macro::ChoiceType, serde::Serialize, serde::Deserialize)] pub enum RealTimeMode { #[label("UTC")] Utc, diff --git a/node-graph/gcore/src/application_io.rs b/node-graph/gcore/src/application_io.rs index 6dfd2863ea..c25da5fc20 100644 --- a/node-graph/gcore/src/application_io.rs +++ b/node-graph/gcore/src/application_io.rs @@ -11,8 +11,7 @@ use std::ptr::addr_of; use std::sync::Arc; use std::time::Duration; -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)] pub struct SurfaceId(pub u64); impl std::fmt::Display for SurfaceId { @@ -21,8 +20,7 @@ impl std::fmt::Display for SurfaceId { } } -#[derive(Debug, Clone, Copy, PartialEq)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Debug, Clone, Copy, PartialEq, serde::Serialize, serde::Deserialize)] pub struct SurfaceFrame { pub surface_id: SurfaceId, pub resolution: UVec2, diff --git a/node-graph/gcore/src/graphic_element.rs b/node-graph/gcore/src/graphic_element.rs index 8bc1fab7f5..1c77b7fd61 100644 --- a/node-graph/gcore/src/graphic_element.rs +++ b/node-graph/gcore/src/graphic_element.rs @@ -12,8 +12,7 @@ use std::hash::Hash; pub mod renderer; -#[derive(Copy, Clone, Debug, PartialEq, DynAny, specta::Type)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Copy, Clone, Debug, PartialEq, DynAny, specta::Type, serde::Serialize, serde::Deserialize)] #[serde(default)] pub struct AlphaBlending { pub blend_mode: BlendMode, @@ -74,15 +73,13 @@ impl AlphaBlending { pub fn migrate_graphic_group<'de, D: serde::Deserializer<'de>>(deserializer: D) -> Result { use serde::Deserialize; - #[derive(Clone, Debug, PartialEq, DynAny, Default)] - #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] + #[derive(Clone, Debug, PartialEq, DynAny, Default, serde::Serialize, serde::Deserialize)] pub struct OldGraphicGroup { elements: Vec<(GraphicElement, Option)>, transform: DAffine2, alpha_blending: AlphaBlending, } - #[derive(Clone, Debug, PartialEq, DynAny, Default)] - #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] + #[derive(Clone, Debug, PartialEq, DynAny, Default, serde::Serialize, serde::Deserialize)] pub struct GraphicGroup { elements: Vec<(GraphicElement, Option)>, } @@ -162,8 +159,7 @@ impl From> for GraphicGroupTable { } /// The possible forms of graphical content held in a Vec by the `elements` field of [`GraphicElement`]. -#[derive(Clone, Debug, Hash, PartialEq, DynAny)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Clone, Debug, Hash, PartialEq, DynAny, serde::Serialize, serde::Deserialize)] pub enum GraphicElement { /// Equivalent to the SVG tag: https://developer.mozilla.org/en-US/docs/Web/SVG/Element/g GraphicGroup(GraphicGroupTable), @@ -279,8 +275,7 @@ impl serde::Serialize for Raster { } /// Some [`ArtboardData`] with some optional clipping bounds that can be exported. -#[derive(Clone, Debug, Hash, PartialEq, DynAny)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Clone, Debug, Hash, PartialEq, DynAny, serde::Serialize, serde::Deserialize)] pub struct Artboard { pub graphic_group: GraphicGroupTable, pub label: String, @@ -313,8 +308,7 @@ impl Artboard { pub fn migrate_artboard_group<'de, D: serde::Deserializer<'de>>(deserializer: D) -> Result { use serde::Deserialize; - #[derive(Clone, Default, Debug, Hash, PartialEq, DynAny)] - #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] + #[derive(Clone, Default, Debug, Hash, PartialEq, DynAny, serde::Serialize, serde::Deserialize)] pub struct ArtboardGroup { pub artboards: Vec<(Artboard, Option)>, } diff --git a/node-graph/gcore/src/graphic_element/renderer.rs b/node-graph/gcore/src/graphic_element/renderer.rs index 00581b9149..cc68f0a687 100644 --- a/node-graph/gcore/src/graphic_element/renderer.rs +++ b/node-graph/gcore/src/graphic_element/renderer.rs @@ -350,8 +350,7 @@ pub fn to_transform(transform: DAffine2) -> usvg::Transform { // TODO: Click targets can be removed from the render output, since the vector data is available in the vector modify data from Monitor nodes. // This will require that the transform for child layers into that layer space be calculated, or it could be returned from the RenderOutput instead of click targets. -#[derive(Debug, Default, Clone, PartialEq, DynAny)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Debug, Default, Clone, PartialEq, DynAny, serde::Serialize, serde::Deserialize)] pub struct RenderMetadata { pub upstream_footprints: HashMap, pub local_transforms: HashMap, diff --git a/node-graph/gcore/src/memo.rs b/node-graph/gcore/src/memo.rs index 23e8ec38b3..e6400a2f61 100644 --- a/node-graph/gcore/src/memo.rs +++ b/node-graph/gcore/src/memo.rs @@ -149,7 +149,6 @@ pub struct MemoHash { value: T, } -#[cfg(feature = "serde")] impl<'de, T: serde::Deserialize<'de> + Hash> serde::Deserialize<'de> for MemoHash { fn deserialize(deserializer: D) -> Result where @@ -159,7 +158,6 @@ impl<'de, T: serde::Deserialize<'de> + Hash> serde::Deserialize<'de> for MemoHas } } -#[cfg(feature = "serde")] impl serde::Serialize for MemoHash { fn serialize(&self, serializer: S) -> Result where diff --git a/node-graph/gcore/src/ops.rs b/node-graph/gcore/src/ops.rs index bce9715665..f9028059aa 100644 --- a/node-graph/gcore/src/ops.rs +++ b/node-graph/gcore/src/ops.rs @@ -530,8 +530,7 @@ fn extract_xy>(_: impl Ctx, #[implementations(DVec2, IVec2, UVec2 } /// The X or Y component of a coordinate. -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] -#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, DynAny, node_macro::ChoiceType, specta::Type)] +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, DynAny, node_macro::ChoiceType, specta::Type, serde::Serialize, serde::Deserialize)] #[widget(Dropdown)] pub enum XY { #[default] diff --git a/node-graph/gcore/src/raster.rs b/node-graph/gcore/src/raster.rs index 88219c9f81..3d8a1ccff2 100644 --- a/node-graph/gcore/src/raster.rs +++ b/node-graph/gcore/src/raster.rs @@ -110,12 +110,10 @@ impl RGBPrimaries for T { pub trait SRGB: Rec709Primaries {} -#[cfg(feature = "serde")] pub trait Serde: serde::Serialize + for<'a> serde::Deserialize<'a> {} #[cfg(not(feature = "serde"))] pub trait Serde {} -#[cfg(feature = "serde")] impl serde::Deserialize<'a>> Serde for T {} #[cfg(not(feature = "serde"))] impl Serde for T {} diff --git a/node-graph/gcore/src/raster/adjustments.rs b/node-graph/gcore/src/raster/adjustments.rs index 1691bfa544..762034bfb0 100644 --- a/node-graph/gcore/src/raster/adjustments.rs +++ b/node-graph/gcore/src/raster/adjustments.rs @@ -29,8 +29,7 @@ use std::fmt::Debug; // https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#:~:text=%27clrL%27%20%3D%20Color%20Lookup // https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#:~:text=Color%20Lookup%20(Photoshop%20CS6 -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] -#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, DynAny, Hash, node_macro::ChoiceType, specta::Type)] +#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, DynAny, Hash, node_macro::ChoiceType, specta::Type, serde::Serialize, serde::Deserialize)] #[widget(Dropdown)] pub enum LuminanceCalculation { #[default] @@ -42,8 +41,7 @@ pub enum LuminanceCalculation { MaximumChannels, } -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] -#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, DynAny, Hash, specta::Type)] +#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, DynAny, Hash, specta::Type, serde::Serialize, serde::Deserialize)] #[repr(i32)] // TODO: Enable Int8 capability for SPIR-V so that we don't need this? pub enum BlendMode { // Basic group @@ -916,8 +914,7 @@ async fn vibrance>( } /// Color Channel -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] -#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, DynAny, node_macro::ChoiceType, specta::Type)] +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, DynAny, node_macro::ChoiceType, specta::Type, serde::Serialize, serde::Deserialize)] #[widget(Radio)] pub enum RedGreenBlue { #[default] @@ -927,8 +924,7 @@ pub enum RedGreenBlue { } /// Color Channel -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] -#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, DynAny, node_macro::ChoiceType, specta::Type)] +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, DynAny, node_macro::ChoiceType, specta::Type, serde::Serialize, serde::Deserialize)] #[widget(Radio)] pub enum RedGreenBlueAlpha { #[default] @@ -939,8 +935,7 @@ pub enum RedGreenBlueAlpha { } /// Style of noise pattern -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] -#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, DynAny, node_macro::ChoiceType, specta::Type)] +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, DynAny, node_macro::ChoiceType, specta::Type, serde::Serialize, serde::Deserialize)] #[widget(Dropdown)] pub enum NoiseType { #[default] @@ -955,8 +950,7 @@ pub enum NoiseType { WhiteNoise, } -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] -#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, DynAny, node_macro::ChoiceType, specta::Type)] +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, DynAny, node_macro::ChoiceType, specta::Type, serde::Serialize, serde::Deserialize)] /// Style of layered levels of the noise pattern pub enum FractalType { #[default] @@ -972,8 +966,7 @@ pub enum FractalType { } /// Distance function used by the cellular noise -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] -#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, DynAny, node_macro::ChoiceType, specta::Type)] +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, DynAny, node_macro::ChoiceType, specta::Type, serde::Serialize, serde::Deserialize)] pub enum CellularDistanceFunction { #[default] Euclidean, @@ -983,8 +976,7 @@ pub enum CellularDistanceFunction { Hybrid, } -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] -#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, DynAny, node_macro::ChoiceType, specta::Type)] +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, DynAny, node_macro::ChoiceType, specta::Type, serde::Serialize, serde::Deserialize)] pub enum CellularReturnType { CellValue, #[default] @@ -1003,8 +995,7 @@ pub enum CellularReturnType { } /// Type of domain warp -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] -#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, DynAny, node_macro::ChoiceType, specta::Type)] +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, DynAny, node_macro::ChoiceType, specta::Type, serde::Serialize, serde::Deserialize)] #[widget(Dropdown)] pub enum DomainWarpType { #[default] @@ -1113,8 +1104,7 @@ async fn channel_mixer>( image } -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] -#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, DynAny, node_macro::ChoiceType, specta::Type)] +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, DynAny, node_macro::ChoiceType, specta::Type, serde::Serialize, serde::Deserialize)] #[widget(Radio)] pub enum RelativeAbsolute { #[default] @@ -1123,8 +1113,7 @@ pub enum RelativeAbsolute { } #[repr(C)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] -#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, DynAny, node_macro::ChoiceType, specta::Type)] +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, DynAny, node_macro::ChoiceType, specta::Type, serde::Serialize, serde::Deserialize)] pub enum SelectiveColorChoice { #[default] Reds, diff --git a/node-graph/gcore/src/raster/brush_cache.rs b/node-graph/gcore/src/raster/brush_cache.rs index f5165c893d..564b5c8010 100644 --- a/node-graph/gcore/src/raster/brush_cache.rs +++ b/node-graph/gcore/src/raster/brush_cache.rs @@ -9,22 +9,21 @@ use std::hash::Hash; use std::sync::Arc; use std::sync::Mutex; -#[derive(Clone, Debug, PartialEq, DynAny, Default)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Clone, Debug, PartialEq, DynAny, Default, serde::Serialize, serde::Deserialize)] struct BrushCacheImpl { // The full previous input that was cached. prev_input: Vec, // The strokes that have been fully processed and blended into the background. - #[cfg_attr(feature = "serde", serde(deserialize_with = "crate::graphene_core::raster::image::migrate_image_frame_instance"))] + #[serde(deserialize_with = "crate::graphene_core::raster::image::migrate_image_frame_instance")] background: Instance>, - #[cfg_attr(feature = "serde", serde(deserialize_with = "crate::graphene_core::raster::image::migrate_image_frame_instance"))] + #[serde(deserialize_with = "crate::graphene_core::raster::image::migrate_image_frame_instance")] blended_image: Instance>, - #[cfg_attr(feature = "serde", serde(deserialize_with = "crate::graphene_core::raster::image::migrate_image_frame_instance"))] + #[serde(deserialize_with = "crate::graphene_core::raster::image::migrate_image_frame_instance")] last_stroke_texture: Instance>, // A cache for brush textures. - #[cfg_attr(feature = "serde", serde(skip))] + #[serde(skip)] brush_texture_cache: HashMap>, } @@ -104,8 +103,7 @@ pub struct BrushPlan { pub first_stroke_point_skip: usize, } -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] -#[derive(Debug, DynAny)] +#[derive(Debug, DynAny, serde::Serialize, serde::Deserialize)] pub struct BrushCache { inner: Arc>, proto: bool, diff --git a/node-graph/gcore/src/raster/color.rs b/node-graph/gcore/src/raster/color.rs index 485fc9a08b..e1e0cd2f8f 100644 --- a/node-graph/gcore/src/raster/color.rs +++ b/node-graph/gcore/src/raster/color.rs @@ -10,8 +10,7 @@ use spirv_std::num_traits::float::Float; use std::hash::Hash; #[repr(C)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] -#[derive(Debug, Default, Clone, Copy, PartialEq, DynAny, Pod, Zeroable)] +#[derive(Debug, Default, Clone, Copy, PartialEq, DynAny, Pod, Zeroable, serde::Serialize, serde::Deserialize)] pub struct RGBA16F { red: f16, green: f16, @@ -83,8 +82,7 @@ impl Alpha for RGBA16F { impl Pixel for RGBA16F {} #[repr(C)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] -#[derive(Debug, Default, Clone, Copy, PartialEq, DynAny, Pod, Zeroable, specta::Type)] +#[derive(Debug, Default, Clone, Copy, PartialEq, DynAny, Pod, Zeroable, specta::Type, serde::Serialize, serde::Deserialize)] pub struct SRGBA8 { red: u8, green: u8, @@ -164,8 +162,7 @@ impl Alpha for SRGBA8 { impl Pixel for SRGBA8 {} #[repr(C)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] -#[derive(Debug, Default, Clone, Copy, PartialEq, DynAny, Pod, Zeroable, specta::Type)] +#[derive(Debug, Default, Clone, Copy, PartialEq, DynAny, Pod, Zeroable, specta::Type, serde::Serialize, serde::Deserialize)] pub struct Luma(pub f32); impl Luminance for Luma { @@ -205,8 +202,7 @@ impl Pixel for Luma {} /// The other components (RGB) are stored as `f32` that range from `0.0` up to `f32::MAX`, /// the values encode the brightness of each channel proportional to the light intensity in cd/m² (nits) in HDR, and `0.0` (black) to `1.0` (white) in SDR color. #[repr(C)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] -#[derive(Debug, Default, Clone, Copy, PartialEq, DynAny, Pod, Zeroable, specta::Type)] +#[derive(Debug, Default, Clone, Copy, PartialEq, DynAny, Pod, Zeroable, specta::Type, serde::Serialize, serde::Deserialize)] pub struct Color { red: f32, green: f32, diff --git a/node-graph/gcore/src/raster/curve.rs b/node-graph/gcore/src/raster/curve.rs index c060d67093..5844ac942e 100644 --- a/node-graph/gcore/src/raster/curve.rs +++ b/node-graph/gcore/src/raster/curve.rs @@ -3,8 +3,7 @@ use crate::Node; use dyn_any::{DynAny, StaticType, StaticTypeSized}; use std::ops::{Add, Mul, Sub}; -#[derive(Debug, Clone, PartialEq, DynAny, specta::Type)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Debug, Clone, PartialEq, DynAny, specta::Type, serde::Serialize, serde::Deserialize)] pub struct Curve { #[serde(rename = "manipulatorGroups")] pub manipulator_groups: Vec, @@ -31,8 +30,7 @@ impl std::hash::Hash for Curve { } } -#[derive(Debug, Clone, Copy, PartialEq, DynAny, specta::Type)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Debug, Clone, Copy, PartialEq, DynAny, specta::Type, serde::Serialize, serde::Deserialize)] pub struct CurveManipulatorGroup { pub anchor: [f32; 2], pub handles: [[f32; 2]; 2], diff --git a/node-graph/gcore/src/raster/image.rs b/node-graph/gcore/src/raster/image.rs index d38dfefdab..1c920a16e7 100644 --- a/node-graph/gcore/src/raster/image.rs +++ b/node-graph/gcore/src/raster/image.rs @@ -8,7 +8,6 @@ use dyn_any::{DynAny, StaticType}; use glam::{DAffine2, DVec2}; use std::vec::Vec; -#[cfg(feature = "serde")] mod base64_serde { //! Basic wrapper for [`serde`] to perform [`base64`] encoding @@ -37,16 +36,15 @@ mod base64_serde { } } -#[derive(Clone, PartialEq, Default, specta::Type)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Clone, PartialEq, Default, specta::Type, serde::Serialize, serde::Deserialize)] pub struct Image { pub width: u32, pub height: u32, - #[cfg_attr(feature = "serde", serde(serialize_with = "base64_serde::as_base64", deserialize_with = "base64_serde::from_base64"))] + #[serde(serialize_with = "base64_serde::as_base64", deserialize_with = "base64_serde::from_base64")] pub data: Vec

, /// Optional: Stores a base64 string representation of the image which can be used to speed up the conversion /// to an svg string. This is used as a cache in order to not have to encode the data on every graph evaluation. - #[cfg_attr(feature = "serde", serde(skip))] + #[serde(skip)] pub base64_string: Option, // TODO: Add an `origin` field to store where in the local space the image is anchored. // TODO: Currently it is always anchored at the top left corner at (0, 0). The bottom right corner of the new origin field would correspond to (1, 1). @@ -230,8 +228,7 @@ pub fn migrate_image_frame<'de, D: serde::Deserializer<'de>>(deserializer: D) -> } } - #[derive(Clone, Debug, Hash, PartialEq, DynAny)] - #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] + #[derive(Clone, Debug, Hash, PartialEq, DynAny, serde::Serialize, serde::Deserialize)] pub enum GraphicElement { /// Equivalent to the SVG tag: https://developer.mozilla.org/en-US/docs/Web/SVG/Element/g GraphicGroup(GraphicGroupTable), @@ -240,8 +237,7 @@ pub fn migrate_image_frame<'de, D: serde::Deserializer<'de>>(deserializer: D) -> RasterFrame(RasterFrame), } - #[derive(Clone, Default, Debug, PartialEq, specta::Type)] - #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] + #[derive(Clone, Default, Debug, PartialEq, specta::Type, serde::Serialize, serde::Deserialize)] pub struct ImageFrame { pub image: Image

, } @@ -269,8 +265,7 @@ pub fn migrate_image_frame<'de, D: serde::Deserializer<'de>>(deserializer: D) -> type Static = ImageFrame; } - #[derive(Clone, Default, Debug, PartialEq, specta::Type)] - #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] + #[derive(Clone, Default, Debug, PartialEq, specta::Type, serde::Serialize, serde::Deserialize)] pub struct OldImageFrame { image: Image

, transform: DAffine2, @@ -326,8 +321,7 @@ pub fn migrate_image_frame_instance<'de, D: serde::Deserializer<'de>>(deserializ } } - #[derive(Clone, Debug, Hash, PartialEq, DynAny)] - #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] + #[derive(Clone, Debug, Hash, PartialEq, DynAny, serde::Serialize, serde::Deserialize)] pub enum GraphicElement { /// Equivalent to the SVG tag: https://developer.mozilla.org/en-US/docs/Web/SVG/Element/g GraphicGroup(GraphicGroupTable), @@ -336,8 +330,7 @@ pub fn migrate_image_frame_instance<'de, D: serde::Deserializer<'de>>(deserializ RasterFrame(RasterFrame), } - #[derive(Clone, Default, Debug, PartialEq, specta::Type)] - #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] + #[derive(Clone, Default, Debug, PartialEq, specta::Type, serde::Serialize, serde::Deserialize)] pub struct ImageFrame { pub image: Image

, } @@ -365,8 +358,7 @@ pub fn migrate_image_frame_instance<'de, D: serde::Deserializer<'de>>(deserializ type Static = ImageFrame; } - #[derive(Clone, Default, Debug, PartialEq, specta::Type)] - #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] + #[derive(Clone, Default, Debug, PartialEq, specta::Type, serde::Serialize, serde::Deserialize)] pub struct OldImageFrame { image: Image

, transform: DAffine2, diff --git a/node-graph/gcore/src/transform.rs b/node-graph/gcore/src/transform.rs index ce21a10ca0..e1587ec729 100644 --- a/node-graph/gcore/src/transform.rs +++ b/node-graph/gcore/src/transform.rs @@ -67,8 +67,7 @@ impl TransformMut for Footprint { } } -#[derive(Debug, Clone, Copy, dyn_any::DynAny, PartialEq)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Debug, Clone, Copy, dyn_any::DynAny, PartialEq, serde::Serialize, serde::Deserialize)] pub enum RenderQuality { /// Low quality, fast rendering Preview, @@ -81,8 +80,7 @@ pub enum RenderQuality { /// Render at full quality Full, } -#[derive(Debug, Clone, Copy, dyn_any::DynAny, PartialEq)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Debug, Clone, Copy, dyn_any::DynAny, PartialEq, serde::Serialize, serde::Deserialize)] pub struct Footprint { /// Inverse of the transform which will be applied to the node output during the rendering process pub transform: DAffine2, diff --git a/node-graph/gcore/src/types.rs b/node-graph/gcore/src/types.rs index b7dd4c7e6b..156d9a85d2 100644 --- a/node-graph/gcore/src/types.rs +++ b/node-graph/gcore/src/types.rs @@ -124,8 +124,7 @@ impl std::fmt::Debug for NodeIOTypes { } } -#[derive(Clone, Debug, PartialEq, Eq, Hash, specta::Type)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Clone, Debug, PartialEq, Eq, Hash, specta::Type, serde::Serialize, serde::Deserialize)] pub struct ProtoNodeIdentifier { pub name: Cow<'static, str>, } @@ -156,10 +155,9 @@ fn migrate_type_descriptor_names<'de, D: serde::Deserializer<'de>>(deserializer: Ok(Cow::Owned(name)) } -#[derive(Clone, Debug, Eq, specta::Type)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Clone, Debug, Eq, specta::Type, serde::Serialize, serde::Deserialize)] pub struct TypeDescriptor { - #[cfg_attr(feature = "serde", serde(skip))] + #[serde(skip)] #[specta(skip)] pub id: Option, #[serde(deserialize_with = "migrate_type_descriptor_names")] @@ -192,8 +190,7 @@ impl PartialEq for TypeDescriptor { } /// Graph runtime type information used for type inference. -#[derive(Clone, PartialEq, Eq, Hash, specta::Type)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Clone, PartialEq, Eq, Hash, specta::Type, serde::Serialize, serde::Deserialize)] pub enum Type { /// A wrapper for some type variable used within the inference system. Resolved at inference time and replaced with a concrete type. Generic(Cow<'static, str>), diff --git a/node-graph/gcore/src/vector/brush_stroke.rs b/node-graph/gcore/src/vector/brush_stroke.rs index 5360686b1b..e1c2ae6342 100644 --- a/node-graph/gcore/src/vector/brush_stroke.rs +++ b/node-graph/gcore/src/vector/brush_stroke.rs @@ -6,8 +6,7 @@ use glam::DVec2; use std::hash::{Hash, Hasher}; /// The style of a brush. -#[derive(Clone, Debug, DynAny)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Clone, Debug, DynAny, serde::Serialize, serde::Deserialize)] pub struct BrushStyle { pub color: Color, pub diameter: f64, @@ -55,8 +54,7 @@ impl PartialEq for BrushStyle { } /// A single sample of brush parameters across the brush stroke. -#[derive(Clone, Debug, PartialEq, DynAny)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Clone, Debug, PartialEq, DynAny, serde::Serialize, serde::Deserialize)] pub struct BrushInputSample { // The position of the sample in layer space, in pixels. // The origin of layer space is not specified. @@ -72,8 +70,7 @@ impl Hash for BrushInputSample { } /// The parameters for a single stroke brush. -#[derive(Clone, Debug, PartialEq, Hash, Default, DynAny)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Clone, Debug, PartialEq, Hash, Default, DynAny, serde::Serialize, serde::Deserialize)] pub struct BrushStroke { pub style: BrushStyle, pub trace: Vec, diff --git a/node-graph/gcore/src/vector/vector_data.rs b/node-graph/gcore/src/vector/vector_data.rs index 3ab8706472..7d5a536357 100644 --- a/node-graph/gcore/src/vector/vector_data.rs +++ b/node-graph/gcore/src/vector/vector_data.rs @@ -21,8 +21,7 @@ use std::collections::HashMap; pub fn migrate_vector_data<'de, D: serde::Deserializer<'de>>(deserializer: D) -> Result { use serde::Deserialize; - #[derive(Clone, Debug, PartialEq, DynAny)] - #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] + #[derive(Clone, Debug, PartialEq, DynAny, serde::Serialize, serde::Deserialize)] pub struct OldVectorData { pub transform: DAffine2, pub alpha_blending: AlphaBlending, @@ -75,8 +74,7 @@ pub type VectorDataTable = Instances; /// It contains a list of subpaths (that may be open or closed), a transform, and some style information. /// /// Segments are connected if they share endpoints. -#[derive(Clone, Debug, PartialEq, DynAny)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Clone, Debug, PartialEq, DynAny, serde::Serialize, serde::Deserialize)] pub struct VectorData { pub style: PathStyle, @@ -495,8 +493,7 @@ impl VectorData { } /// A selectable part of a curve, either an anchor (start or end of a bézier) or a handle (doesn't necessarily go through the bézier but influences curvature). -#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, DynAny)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, DynAny, serde::Serialize, serde::Deserialize)] pub enum ManipulatorPointId { /// A control anchor - the start or end point of a bézier. Anchor(PointId), @@ -583,8 +580,7 @@ impl ManipulatorPointId { } /// The type of handle found on a bézier curve. -#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, DynAny)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, DynAny, serde::Serialize, serde::Deserialize)] pub enum HandleType { /// The first handle on a cubic bézier or the only handle on a quadratic bézier. Primary, @@ -593,8 +589,7 @@ pub enum HandleType { } /// Represents a primary or end handle found in a particular segment. -#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, DynAny)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, DynAny, serde::Serialize, serde::Deserialize)] pub struct HandleId { pub ty: HandleType, pub segment: SegmentId, diff --git a/node-graph/gcore/src/vector/vector_data/attributes.rs b/node-graph/gcore/src/vector/vector_data/attributes.rs index 205fb3a097..af1758ef2b 100644 --- a/node-graph/gcore/src/vector/vector_data/attributes.rs +++ b/node-graph/gcore/src/vector/vector_data/attributes.rs @@ -12,7 +12,7 @@ macro_rules! create_ids { ($($id:ident),*) => { $( #[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Ord, Eq, Hash, DynAny)] - #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] + #[derive(serde::Serialize, serde::Deserialize)] /// A strongly typed ID pub struct $id(u64); @@ -77,8 +77,7 @@ impl std::hash::BuildHasher for NoHashBuilder { } } -#[derive(Clone, Debug, Default, PartialEq, DynAny)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Clone, Debug, Default, PartialEq, DynAny, serde::Serialize, serde::Deserialize)] /// Stores data which is per-point. Each point is merely a position and can be used in a point cloud or to for a bézier path. In future this will be extendable at runtime with custom attributes. pub struct PointDomain { id: Vec, @@ -195,8 +194,7 @@ impl PointDomain { } } -#[derive(Clone, Debug, Default, PartialEq, Hash, DynAny)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Clone, Debug, Default, PartialEq, Hash, DynAny, serde::Serialize, serde::Deserialize)] /// Stores data which is per-segment. A segment is a bézier curve between two end points with a stroke. In future this will be extendable at runtime with custom attributes. pub struct SegmentDomain { #[serde(alias = "ids")] @@ -439,8 +437,7 @@ impl SegmentDomain { } } -#[derive(Clone, Debug, Default, PartialEq, Hash, DynAny)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Clone, Debug, Default, PartialEq, Hash, DynAny, serde::Serialize, serde::Deserialize)] /// Stores data which is per-region. A region is an enclosed area composed of a range of segments from the /// [`SegmentDomain`] that can be given a fill. In future this will be extendable at runtime with custom attributes. pub struct RegionDomain { diff --git a/node-graph/gcore/src/vector/vector_data/modification.rs b/node-graph/gcore/src/vector/vector_data/modification.rs index d4f1b180b7..15ed28b638 100644 --- a/node-graph/gcore/src/vector/vector_data/modification.rs +++ b/node-graph/gcore/src/vector/vector_data/modification.rs @@ -9,8 +9,7 @@ use std::collections::{HashMap, HashSet}; use std::hash::BuildHasher; /// Represents a procedural change to the [`PointDomain`] in [`VectorData`]. -#[derive(Clone, Debug, Default, PartialEq)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)] pub struct PointModification { add: Vec, remove: HashSet, @@ -81,8 +80,7 @@ impl PointModification { } /// Represents a procedural change to the [`SegmentDomain`] in [`VectorData`]. -#[derive(Clone, Debug, Default, PartialEq)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)] pub struct SegmentModification { add: Vec, remove: HashSet, @@ -254,8 +252,7 @@ impl SegmentModification { } /// Represents a procedural change to the [`RegionDomain`] in [`VectorData`]. -#[derive(Clone, Debug, Default, PartialEq)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Clone, Debug, Default, PartialEq, serde::Serialize, serde::Deserialize)] pub struct RegionModification { add: Vec, remove: HashSet, @@ -299,8 +296,7 @@ impl RegionModification { } /// Represents a procedural change to the [`VectorData`]. -#[derive(Clone, Debug, Default, PartialEq, DynAny)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Clone, Debug, Default, PartialEq, DynAny, serde::Serialize, serde::Deserialize)] pub struct VectorModification { points: PointModification, segments: SegmentModification, diff --git a/node-graph/graph-craft/Cargo.toml b/node-graph/graph-craft/Cargo.toml index e56eb72402..91e800eb6c 100644 --- a/node-graph/graph-craft/Cargo.toml +++ b/node-graph/graph-craft/Cargo.toml @@ -6,12 +6,11 @@ license = "MIT OR Apache-2.0" [features] default = ["dealloc_nodes"] -serde = ["dep:serde", "graphene-core/serde", "glam/serde", "bezier-rs/serde"] dealloc_nodes = ["graphene-core/dealloc_nodes"] wgpu = ["wgpu-executor"] tokio = ["dep:tokio"] wayland = [] -loading = ["serde_json", "serde"] +loading = ["serde_json"] [dependencies] # Local dependencies @@ -26,10 +25,10 @@ specta = { workspace = true } rustc-hash = { workspace = true } url = { workspace = true } reqwest = { workspace = true } +serde = { workspace = true } # Optional workspace dependencies wgpu-executor = { workspace = true, optional = true } -serde = { workspace = true, optional = true } tokio = { workspace = true, optional = true } serde_json = { workspace = true, optional = true } diff --git a/node-graph/graph-craft/src/document.rs b/node-graph/graph-craft/src/document.rs index 0a400de958..169fcd69e1 100644 --- a/node-graph/graph-craft/src/document.rs +++ b/node-graph/graph-craft/src/document.rs @@ -25,7 +25,6 @@ fn merge_ids(a: NodeId, b: NodeId) -> NodeId { /// Utility function for providing a default boolean value to serde. #[inline(always)] -#[cfg(feature = "serde")] fn return_true() -> bool { true } @@ -33,8 +32,7 @@ fn return_true() -> bool { /// An instance of a [`DocumentNodeDefinition`] that has been instantiated in a [`NodeNetwork`]. /// Currently, when an instance is made, it lives all on its own without any lasting connection to the definition. /// But we will want to change it in the future so it merely references its definition. -#[derive(Clone, Debug, PartialEq, Hash, DynAny)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Clone, Debug, PartialEq, Hash, DynAny, serde::Serialize, serde::Deserialize)] pub struct DocumentNode { /// The inputs to a node, which are either: /// - From other nodes within this graph [`NodeInput::Node`], @@ -44,7 +42,7 @@ pub struct DocumentNode { /// In the root network, it is resolved when evaluating the borrow tree. /// Ensure the click target in the encapsulating network is updated when the inputs cause the node shape to change (currently only when exposing/hiding an input) /// by using network.update_click_target(node_id). - #[cfg_attr(all(feature = "serde", target_arch = "wasm32"), serde(alias = "outputs"))] + #[cfg_attr(target_arch = "wasm32", serde(alias = "outputs"))] pub inputs: Vec, /// Manual composition is the methodology by which most nodes are implemented, involving a call argument and upstream inputs. /// By contrast, automatic composition is an alternative way to handle the composition of nodes as they execute in the graph. @@ -144,29 +142,27 @@ pub struct DocumentNode { // A nested document network or a proto-node identifier. pub implementation: DocumentNodeImplementation, /// Represents the eye icon for hiding/showing the node in the graph UI. When hidden, a node gets replaced with an identity node during the graph flattening step. - #[cfg_attr(feature = "serde", serde(default = "return_true"))] + #[serde(default = "return_true")] pub visible: bool, /// When two different proto nodes hash to the same value (e.g. two value nodes each containing `2_u32` or two multiply nodes that have the same node IDs as input), the duplicates are removed. /// See [`ProtoNetwork::generate_stable_node_ids`] for details. /// However sometimes this is not desirable, for example in the case of a [`graphene_core::memo::MonitorNode`] that needs to be accessed outside of the graph. - #[cfg_attr(feature = "serde", serde(default))] + #[serde(default)] pub skip_deduplication: bool, /// The path to this node and its inputs and outputs as of when [`NodeNetwork::generate_node_paths`] was called. - #[cfg_attr(feature = "serde", serde(skip))] + #[serde(skip)] pub original_location: OriginalLocation, } /// Represents the original location of a node input/output when [`NodeNetwork::generate_node_paths`] was called, allowing the types and errors to be derived. -#[derive(Clone, Debug, PartialEq, Eq, Hash, DynAny)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Clone, Debug, PartialEq, Eq, Hash, DynAny, serde::Serialize, serde::Deserialize)] pub struct Source { pub node: Vec, pub index: usize, } /// The path to this node and its inputs and outputs as of when [`NodeNetwork::generate_node_paths`] was called. -#[derive(Clone, Debug, PartialEq, Eq, DynAny, Default)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Clone, Debug, PartialEq, Eq, DynAny, Default, serde::Serialize, serde::Deserialize)] #[non_exhaustive] pub struct OriginalLocation { /// The original location to the document node - e.g. [grandparent_id, parent_id, node_id]. @@ -285,8 +281,7 @@ impl DocumentNode { } /// Represents the possible inputs to a node. -#[derive(Debug, Clone, PartialEq, Hash, DynAny)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Debug, Clone, PartialEq, Hash, DynAny, serde::Serialize, serde::Deserialize)] pub enum NodeInput { /// A reference to another node in the same network from which this node can receive its input. Node { node_id: NodeId, output_index: usize, lambda: bool }, @@ -309,8 +304,7 @@ pub enum NodeInput { Inline(InlineRust), } -#[derive(Debug, Clone, PartialEq, Hash, DynAny)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Debug, Clone, PartialEq, Hash, DynAny, serde::Serialize, serde::Deserialize)] pub struct InlineRust { pub expr: String, pub ty: Type, @@ -322,8 +316,7 @@ impl InlineRust { } } -#[derive(Debug, Clone, PartialEq, Hash, DynAny)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Debug, Clone, PartialEq, Hash, DynAny, serde::Serialize, serde::Deserialize)] pub enum DocumentNodeMetadata { DocumentNodePath, } @@ -408,8 +401,7 @@ impl NodeInput { } } -#[derive(Clone, Debug, DynAny)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Clone, Debug, DynAny, serde::Serialize, serde::Deserialize)] /// Represents the implementation of a node, which can be a nested [`NodeNetwork`], a proto [`ProtoNodeIdentifier`], or `Extract`. pub enum OldDocumentNodeImplementation { /// This describes a (document) node built out of a subgraph of other (document) nodes. @@ -419,7 +411,7 @@ pub enum OldDocumentNodeImplementation { /// This describes a (document) node implemented as a proto node. /// /// A proto node identifier which can be found in `node_registry.rs`. - #[cfg_attr(feature = "serde", serde(alias = "Unresolved"))] // TODO: Eventually remove this alias document upgrade code + #[serde(alias = "Unresolved")] // TODO: Eventually remove this alias document upgrade code ProtoNode(ProtoNodeIdentifier), /// The Extract variant is a tag which tells the compilation process to do something special. It invokes language-level functionality built for use by the ExtractNode to enable metaprogramming. /// When the ExtractNode is compiled, it gets replaced by a value node containing a representation of the source code for the function/lambda of the document node that's fed into the ExtractNode @@ -443,8 +435,7 @@ pub enum OldDocumentNodeImplementation { Extract, } -#[derive(Clone, Debug, PartialEq, Hash, DynAny)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Clone, Debug, PartialEq, Hash, DynAny, serde::Serialize, serde::Deserialize)] /// Represents the implementation of a node, which can be a nested [`NodeNetwork`], a proto [`ProtoNodeIdentifier`], or `Extract`. pub enum DocumentNodeImplementation { /// This describes a (document) node built out of a subgraph of other (document) nodes. @@ -454,7 +445,7 @@ pub enum DocumentNodeImplementation { /// This describes a (document) node implemented as a proto node. /// /// A proto node identifier which can be found in `node_registry.rs`. - #[cfg_attr(feature = "serde", serde(alias = "Unresolved"))] // TODO: Eventually remove this alias document upgrade code + #[serde(alias = "Unresolved")] // TODO: Eventually remove this alias document upgrade code ProtoNode(ProtoNodeIdentifier), /// The Extract variant is a tag which tells the compilation process to do something special. It invokes language-level functionality built for use by the ExtractNode to enable metaprogramming. /// When the ExtractNode is compiled, it gets replaced by a value node containing a representation of the source code for the function/lambda of the document node that's fed into the ExtractNode @@ -519,24 +510,21 @@ impl DocumentNodeImplementation { } // TODO: Eventually remove this document upgrade code -#[derive(Debug)] -#[cfg_attr(feature = "serde", derive(serde::Deserialize))] -#[cfg_attr(feature = "serde", serde(untagged))] +#[derive(Debug, serde::Deserialize)] +#[serde(untagged)] pub enum NodeExportVersions { OldNodeInput(NodeOutput), NodeInput(NodeInput), } // TODO: Eventually remove this document upgrade code -#[derive(Debug)] -#[cfg_attr(feature = "serde", derive(serde::Deserialize))] +#[derive(Debug, serde::Deserialize)] pub struct NodeOutput { pub node_id: NodeId, pub node_output_index: usize, } // TODO: Eventually remove this document upgrade code -#[cfg(feature = "serde")] fn deserialize_exports<'de, D>(deserializer: D) -> Result, D::Error> where D: serde::Deserializer<'de>, @@ -562,16 +550,15 @@ where /// An instance of a [`DocumentNodeDefinition`] that has been instantiated in a [`NodeNetwork`]. /// Currently, when an instance is made, it lives all on its own without any lasting connection to the definition. /// But we will want to change it in the future so it merely references its definition. -#[derive(Clone, Debug, DynAny)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Clone, Debug, DynAny, serde::Serialize, serde::Deserialize)] pub struct OldDocumentNode { /// A name chosen by the user for this instance of the node. Empty indicates no given name, in which case the node definition's name is displayed to the user in italics. /// Ensure the click target in the encapsulating network is updated when this is modified by using network.update_click_target(node_id). - #[cfg_attr(feature = "serde", serde(default))] + #[serde(default)] pub alias: String, // TODO: Replace this name with a reference to the [`DocumentNodeDefinition`] node definition to use the name from there instead. /// The name of the node definition, as originally set by [`DocumentNodeDefinition`], used to display in the UI and to display the appropriate properties. - #[cfg_attr(feature = "serde", serde(deserialize_with = "migrate_layer_to_merge"))] + #[serde(deserialize_with = "migrate_layer_to_merge")] pub name: String, /// The inputs to a node, which are either: /// - From other nodes within this graph [`NodeInput::Node`], @@ -580,48 +567,46 @@ pub struct OldDocumentNode { /// /// In the root network, it is resolved when evaluating the borrow tree. /// Ensure the click target in the encapsulating network is updated when the inputs cause the node shape to change (currently only when exposing/hiding an input) by using network.update_click_target(node_id). - #[cfg_attr(all(feature = "serde", target_arch = "wasm32"), serde(alias = "outputs"))] + #[cfg_attr(target_arch = "wasm32", serde(alias = "outputs"))] pub inputs: Vec, pub manual_composition: Option, // TODO: Remove once this references its definition instead (see above TODO). /// Indicates to the UI if a primary output should be drawn for this node. /// True for most nodes, but the Split Channels node is an example of a node that has multiple secondary outputs but no primary output. - #[cfg_attr(feature = "serde", serde(default = "return_true"))] + #[serde(default = "return_true")] pub has_primary_output: bool, // A nested document network or a proto-node identifier. pub implementation: OldDocumentNodeImplementation, /// User chosen state for displaying this as a left-to-right node or bottom-to-top layer. Ensure the click target in the encapsulating network is updated when the node changes to a layer by using network.update_click_target(node_id). - #[cfg_attr(feature = "serde", serde(default))] + #[serde(default)] pub is_layer: bool, /// Represents the eye icon for hiding/showing the node in the graph UI. When hidden, a node gets replaced with an identity node during the graph flattening step. - #[cfg_attr(feature = "serde", serde(default = "return_true"))] + #[serde(default = "return_true")] pub visible: bool, /// Represents the lock icon for locking/unlocking the node in the graph UI. When locked, a node cannot be moved in the graph UI. - #[cfg_attr(feature = "serde", serde(default))] + #[serde(default)] pub locked: bool, /// Metadata about the node including its position in the graph UI. Ensure the click target in the encapsulating network is updated when the node moves by using network.update_click_target(node_id). pub metadata: OldDocumentNodeMetadata, /// When two different proto nodes hash to the same value (e.g. two value nodes each containing `2_u32` or two multiply nodes that have the same node IDs as input), the duplicates are removed. /// See [`ProtoNetwork::generate_stable_node_ids`] for details. /// However sometimes this is not desirable, for example in the case of a [`graphene_core::memo::MonitorNode`] that needs to be accessed outside of the graph. - #[cfg_attr(feature = "serde", serde(default))] + #[serde(default)] pub skip_deduplication: bool, /// The path to this node and its inputs and outputs as of when [`NodeNetwork::generate_node_paths`] was called. - #[cfg_attr(feature = "serde", serde(skip))] + #[serde(skip)] pub original_location: OriginalLocation, } // TODO: Eventually remove this document upgrade code -#[derive(Clone, Debug, PartialEq, Default, specta::Type, Hash, DynAny)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Clone, Debug, PartialEq, Default, specta::Type, Hash, DynAny, serde::Serialize, serde::Deserialize)] /// Metadata about the node including its position in the graph UI pub struct OldDocumentNodeMetadata { pub position: IVec2, } // TODO: Eventually remove this document upgrade code -#[derive(Clone, Copy, Debug, PartialEq, Hash)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Clone, Copy, Debug, PartialEq, Hash, serde::Serialize, serde::Deserialize)] /// Root Node is the "default" export for a node network. Used by document metadata, displaying UI-only "Export" node, and for restoring the default preview node. pub struct OldRootNode { pub id: NodeId, @@ -629,8 +614,7 @@ pub struct OldRootNode { } // TODO: Eventually remove this document upgrade code -#[derive(PartialEq, Debug, Clone, Hash, Default)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(PartialEq, Debug, Clone, Hash, Default, serde::Serialize, serde::Deserialize)] pub enum OldPreviewing { /// If there is a node to restore the connection to the export for, then it is stored in the option. /// Otherwise, nothing gets restored and the primary export is disconnected. @@ -640,34 +624,32 @@ pub enum OldPreviewing { } // TODO: Eventually remove this document upgrade code -#[derive(Clone, Debug, DynAny)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Clone, Debug, DynAny, serde::Serialize, serde::Deserialize)] /// A network (subgraph) of nodes containing each [`DocumentNode`] and its ID, as well as list mapping each export to its connected node, or a value if disconnected pub struct OldNodeNetwork { /// The list of data outputs that are exported from this network to the parent network. /// Each export is a reference to a node within this network, paired with its output index, that is the source of the network's exported data. - #[cfg_attr(feature = "serde", serde(alias = "outputs", deserialize_with = "deserialize_exports"))] // TODO: Eventually remove this alias document upgrade code + #[serde(alias = "outputs", deserialize_with = "deserialize_exports")] // TODO: Eventually remove this alias document upgrade code pub exports: Vec, /// The list of all nodes in this network. - //cfg_attr(feature = "serde", #[cfg_attr(feature = "serde", serde(serialize_with = "graphene_core::vector::serialize_hashmap", deserialize_with = "graphene_core::vector::deserialize_hashmap")))] + //cfg_attr(feature = "serde", #[serde(serialize_with = "graphene_core::vector::serialize_hashmap", deserialize_with = "graphene_core::vector::deserialize_hashmap"))] pub nodes: HashMap, /// Indicates whether the network is currently rendered with a particular node that is previewed, and if so, which connection should be restored when the preview ends. - #[cfg_attr(feature = "serde", serde(default))] + #[serde(default)] pub previewing: OldPreviewing, /// Temporary fields to store metadata for "Import"/"Export" UI-only nodes, eventually will be replaced with lines leading to edges - #[cfg_attr(feature = "serde", serde(default = "default_import_metadata"))] + #[serde(default = "default_import_metadata")] pub imports_metadata: (NodeId, IVec2), - #[cfg_attr(feature = "serde", serde(default = "default_export_metadata"))] + #[serde(default = "default_export_metadata")] pub exports_metadata: (NodeId, IVec2), /// A network may expose nodes as constants which can by used by other nodes using a `NodeInput::Scope(key)`. - #[cfg_attr(feature = "serde", serde(default))] - //cfg_attr(feature = "serde", #[cfg_attr(feature = "serde", serde(serialize_with = "graphene_core::vector::serialize_hashmap", deserialize_with = "graphene_core::vector::deserialize_hashmap")))] + #[serde(default)] + //cfg_attr(feature = "serde", #[serde(serialize_with = "graphene_core::vector::serialize_hashmap", deserialize_with = "graphene_core::vector::deserialize_hashmap"))] pub scope_injections: HashMap, } // TODO: Eventually remove this document upgrade code -#[cfg(feature = "serde")] fn migrate_layer_to_merge<'de, D: serde::Deserializer<'de>>(deserializer: D) -> Result { let mut s: String = serde::Deserialize::deserialize(deserializer)?; if s == "Layer" { @@ -676,39 +658,30 @@ fn migrate_layer_to_merge<'de, D: serde::Deserializer<'de>>(deserializer: D) -> Ok(s) } // TODO: Eventually remove this document upgrade code -#[cfg(feature = "serde")] fn default_import_metadata() -> (NodeId, IVec2) { (NodeId::new(), IVec2::new(-25, -4)) } // TODO: Eventually remove this document upgrade code -#[cfg(feature = "serde")] fn default_export_metadata() -> (NodeId, IVec2) { (NodeId::new(), IVec2::new(8, -4)) } -#[derive(Clone, Default, Debug, DynAny)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Clone, Default, Debug, DynAny, serde::Serialize, serde::Deserialize)] /// A network (subgraph) of nodes containing each [`DocumentNode`] and its ID, as well as list mapping each export to its connected node, or a value if disconnected pub struct NodeNetwork { /// The list of data outputs that are exported from this network to the parent network. /// Each export is a reference to a node within this network, paired with its output index, that is the source of the network's exported data. // TODO: Eventually remove this alias document upgrade code - #[cfg_attr(all(feature = "serde", target_arch = "wasm32"), serde(alias = "outputs", deserialize_with = "deserialize_exports"))] + #[cfg_attr(target_arch = "wasm32", serde(alias = "outputs", deserialize_with = "deserialize_exports"))] pub exports: Vec, // TODO: Instead of storing import types in each NodeInput::Network connection, the types are stored here. This is similar to how types need to be defined for parameters when creating a function in Rust. // pub import_types: Vec, /// The list of all nodes in this network. - #[cfg_attr( - feature = "serde", - serde(serialize_with = "graphene_core::vector::serialize_hashmap", deserialize_with = "graphene_core::vector::deserialize_hashmap") - )] + #[serde(serialize_with = "graphene_core::vector::serialize_hashmap", deserialize_with = "graphene_core::vector::deserialize_hashmap")] pub nodes: FxHashMap, /// A network may expose nodes as constants which can by used by other nodes using a `NodeInput::Scope(key)`. - #[cfg_attr(feature = "serde", serde(default))] - #[cfg_attr( - feature = "serde", - serde(serialize_with = "graphene_core::vector::serialize_hashmap", deserialize_with = "graphene_core::vector::deserialize_hashmap") - )] + #[serde(default)] + #[serde(serialize_with = "graphene_core::vector::serialize_hashmap", deserialize_with = "graphene_core::vector::deserialize_hashmap")] pub scope_injections: FxHashMap, } diff --git a/node-graph/graph-craft/src/document/value.rs b/node-graph/graph-craft/src/document/value.rs index 2da074e6c8..94aa05342f 100644 --- a/node-graph/graph-craft/src/document/value.rs +++ b/node-graph/graph-craft/src/document/value.rs @@ -24,15 +24,14 @@ pub struct TaggedValueTypeError; macro_rules! tagged_value { ($ ($( #[$meta:meta] )* $identifier:ident ($ty:ty) ),* $(,)?) => { /// A type that is known, allowing serialization (serde::Deserialize is not object safe) - #[derive(Clone, Debug, PartialEq)] - #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] + #[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)] #[allow(clippy::large_enum_variant)] // TODO(TrueDoctor): Properly solve this disparity between the size of the largest and next largest variants pub enum TaggedValue { None, $( $(#[$meta] ) *$identifier( $ty ), )* RenderOutput(RenderOutput), SurfaceFrame(graphene_core::SurfaceFrame), - #[cfg_attr(feature = "serde", serde(skip))] + #[serde(skip)] EditorApi(Arc) } @@ -159,7 +158,7 @@ tagged_value! { // =============== // PRIMITIVE TYPES // =============== - #[cfg_attr(feature = "serde", serde(alias = "F32"))] // TODO: Eventually remove this alias document upgrade code + #[serde(alias = "F32")] // TODO: Eventually remove this alias document upgrade code F64(f64), U32(u32), U64(u64), @@ -174,25 +173,25 @@ tagged_value! { // ========================== // PRIMITIVE COLLECTION TYPES // ========================== - #[cfg_attr(feature = "serde", serde(alias = "VecF32"))] // TODO: Eventually remove this alias document upgrade code + #[serde(alias = "VecF32")] // TODO: Eventually remove this alias document upgrade code VecF64(Vec), VecU64(Vec), VecDVec2(Vec), F64Array4([f64; 4]), NodePath(Vec), - #[cfg_attr(feature = "serde", serde(alias = "ManipulatorGroupIds"))] // TODO: Eventually remove this alias document upgrade code + #[serde(alias = "ManipulatorGroupIds")] // TODO: Eventually remove this alias document upgrade code PointIds(Vec), // ==================== // GRAPHICAL DATA TYPES // ==================== GraphicElement(graphene_core::GraphicElement), - #[cfg_attr(all(feature = "serde", target_arch = "wasm32"), serde(deserialize_with = "graphene_core::vector::migrate_vector_data"))] // TODO: Eventually remove this migration document upgrade code + #[cfg_attr(target_arch = "wasm32", serde(deserialize_with = "graphene_core::vector::migrate_vector_data"))] // TODO: Eventually remove this migration document upgrade code VectorData(graphene_core::vector::VectorDataTable), - #[cfg_attr(all(feature = "serde", target_arch = "wasm32"), serde(alias = "ImageFrame", deserialize_with = "graphene_core::raster::image::migrate_image_frame"))] // TODO: Eventually remove this migration document upgrade code + #[cfg_attr(target_arch = "wasm32", serde(alias = "ImageFrame", deserialize_with = "graphene_core::raster::image::migrate_image_frame"))] // TODO: Eventually remove this migration document upgrade code RasterData(graphene_core::raster_types::RasterDataTable), - #[cfg_attr(all(feature = "serde", target_arch = "wasm32"), serde(deserialize_with = "graphene_core::migrate_graphic_group"))] // TODO: Eventually remove this migration document upgrade code + #[cfg_attr(target_arch = "wasm32", serde(deserialize_with = "graphene_core::migrate_graphic_group"))] // TODO: Eventually remove this migration document upgrade code GraphicGroup(graphene_core::GraphicGroupTable), - #[cfg_attr(all(feature = "serde", target_arch = "wasm32"), serde(deserialize_with = "graphene_core::migrate_artboard_group"))] // TODO: Eventually remove this migration document upgrade code + #[cfg_attr(target_arch = "wasm32", serde(deserialize_with = "graphene_core::migrate_artboard_group"))] // TODO: Eventually remove this migration document upgrade code ArtboardGroup(graphene_core::ArtboardGroupTable), // ============ // STRUCT TYPES @@ -206,7 +205,7 @@ tagged_value! { Fill(graphene_core::vector::style::Fill), Stroke(graphene_core::vector::style::Stroke), Gradient(graphene_core::vector::style::Gradient), - #[cfg_attr(feature = "serde", serde(alias = "GradientPositions"))] // TODO: Eventually remove this alias document upgrade code + #[serde(alias = "GradientPositions")] // TODO: Eventually remove this alias document upgrade code GradientStops(graphene_core::vector::style::GradientStops), Font(graphene_core::text::Font), BrushStrokes(Vec), @@ -422,15 +421,13 @@ impl + Sync + Send, U: Sync + Send> UpcastAsRefNode { } } -#[derive(Debug, Clone, PartialEq, dyn_any::DynAny)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Debug, Clone, PartialEq, dyn_any::DynAny, serde::Serialize, serde::Deserialize)] pub struct RenderOutput { pub data: RenderOutputType, pub metadata: RenderMetadata, } -#[derive(Debug, Clone, PartialEq, dyn_any::DynAny, Hash)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Debug, Clone, PartialEq, dyn_any::DynAny, Hash, serde::Serialize, serde::Deserialize)] pub enum RenderOutputType { CanvasFrame(graphene_core::SurfaceFrame), Svg(String), diff --git a/node-graph/graph-craft/src/imaginate_input.rs b/node-graph/graph-craft/src/imaginate_input.rs index b73eb12e46..0c1625cb38 100644 --- a/node-graph/graph-craft/src/imaginate_input.rs +++ b/node-graph/graph-craft/src/imaginate_input.rs @@ -5,8 +5,7 @@ use std::fmt::Debug; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::{Arc, Mutex}; -#[derive(Default, Debug, Clone, DynAny, specta::Type)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Default, Debug, Clone, DynAny, specta::Type, serde::Serialize, serde::Deserialize)] pub struct ImaginateCache(Arc>>); impl ImaginateCache { @@ -31,8 +30,7 @@ pub trait ImaginateTerminationHandle: Debug + Send + 'static { fn terminate(&self); } -#[derive(Default, Debug, specta::Type)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Default, Debug, specta::Type, serde::Serialize, serde::Deserialize)] struct InternalImaginateControl { #[serde(skip)] status: Mutex, @@ -42,8 +40,7 @@ struct InternalImaginateControl { termination_sender: Mutex>>, } -#[derive(Debug, Default, Clone, DynAny, specta::Type)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Debug, Default, Clone, DynAny, specta::Type, serde::Serialize, serde::Deserialize)] pub struct ImaginateController(Arc); impl ImaginateController { @@ -90,8 +87,7 @@ impl core::hash::Hash for ImaginateController { } } -#[derive(Default, Debug, Clone, PartialEq, DynAny, specta::Type)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Default, Debug, Clone, PartialEq, DynAny, specta::Type, serde::Serialize, serde::Deserialize)] pub enum ImaginateStatus { #[default] Ready, @@ -152,16 +148,14 @@ impl ImaginateServerStatus { } } -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] -#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, specta::Type, Hash)] +#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, specta::Type, Hash, serde::Serialize, serde::Deserialize)] pub enum ImaginateMaskPaintMode { #[default] Inpaint, Outpaint, } -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] -#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, DynAny, specta::Type, Hash)] +#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, DynAny, specta::Type, Hash, serde::Serialize, serde::Deserialize)] pub enum ImaginateMaskStartingFill { #[default] Fill, @@ -192,8 +186,7 @@ impl std::fmt::Display for ImaginateMaskStartingFill { } } -#[derive(Debug, Default, Copy, Clone, Eq, PartialEq, DynAny, specta::Type, Hash)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Debug, Default, Copy, Clone, Eq, PartialEq, DynAny, specta::Type, Hash, serde::Serialize, serde::Deserialize)] pub enum ImaginateSamplingMethod { #[default] EulerA, diff --git a/node-graph/graph-craft/src/proto.rs b/node-graph/graph-craft/src/proto.rs index 7c5d0f590b..4330976609 100644 --- a/node-graph/graph-craft/src/proto.rs +++ b/node-graph/graph-craft/src/proto.rs @@ -3,14 +3,12 @@ use crate::document::{NodeId, OriginalLocation}; pub use graphene_core::registry::*; use graphene_core::*; use rustc_hash::FxHashMap; -#[cfg(feature = "serde")] use std::borrow::Cow; use std::collections::{HashMap, HashSet}; use std::fmt::Debug; use std::hash::Hash; -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] -#[derive(Debug, Default, PartialEq, Clone, Hash, Eq)] +#[derive(Debug, Default, PartialEq, Clone, Hash, Eq, serde::Serialize, serde::Deserialize)] /// A list of [`ProtoNode`]s, which is an intermediate step between the [`crate::document::NodeNetwork`] and the `BorrowTree` containing a single flattened network. pub struct ProtoNetwork { // TODO: remove this since it seems to be unused? @@ -72,8 +70,7 @@ impl core::fmt::Display for ProtoNetwork { } } -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] -#[derive(Debug, Clone)] +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] /// Defines the arguments used to construct the boxed node struct. This is used to call the constructor function in the `node_registry.rs` file - which is hidden behind a wall of macros. pub enum ConstructionArgs { /// A value of a type that is known, allowing serialization (serde::Deserialize is not object safe) @@ -132,8 +129,7 @@ impl ConstructionArgs { } } -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] -#[derive(Debug, Clone, PartialEq, Hash, Eq)] +#[derive(Debug, Clone, PartialEq, Hash, Eq, serde::Serialize, serde::Deserialize)] /// A proto node is an intermediate step between the `DocumentNode` and the boxed struct that actually runs the node (found in the [`BorrowTree`]). /// At different stages in the compilation process, this struct will be transformed into a reduced (more restricted) form acting as a subset of its original form, but that restricted form is still valid in the earlier stage in the compilation process before it was transformed. pub struct ProtoNode { @@ -157,8 +153,7 @@ impl Default for ProtoNode { } /// Similar to the document node's [`crate::document::NodeInput`]. -#[derive(Debug, PartialEq, Eq, Clone, Hash)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Debug, PartialEq, Eq, Clone, Hash, serde::Serialize, serde::Deserialize)] pub enum ProtoNodeInput { /// This input will be converted to `()` as the call argument. None, @@ -532,8 +527,7 @@ impl ProtoNetwork { Ok(()) } } -#[derive(Clone, PartialEq)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Clone, PartialEq, serde::Serialize, serde::Deserialize)] pub enum GraphErrorType { NodeNotFound(NodeId), InputNodeNotFound(NodeId), @@ -589,8 +583,7 @@ impl Debug for GraphErrorType { } } } -#[derive(Clone, PartialEq)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Clone, PartialEq, serde::Serialize, serde::Deserialize)] pub struct GraphError { pub node_path: Vec, pub identifier: Cow<'static, str>, diff --git a/node-graph/graph-craft/src/wasm_application_io.rs b/node-graph/graph-craft/src/wasm_application_io.rs index 4a8f4cbedd..9ae94267d8 100644 --- a/node-graph/graph-craft/src/wasm_application_io.rs +++ b/node-graph/graph-craft/src/wasm_application_io.rs @@ -315,8 +315,7 @@ pub type WasmSurfaceHandle = SurfaceHandle; #[cfg(feature = "wgpu")] pub type WasmSurfaceHandleFrame = graphene_core::application_io::SurfaceHandleFrame; -#[derive(Clone, Debug, PartialEq, Hash, specta::Type)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Clone, Debug, PartialEq, Hash, specta::Type, serde::Serialize, serde::Deserialize)] pub struct EditorPreferences { // pub imaginate_hostname: String, pub use_vello: bool, diff --git a/node-graph/graphene-cli/Cargo.toml b/node-graph/graphene-cli/Cargo.toml index 16bb7b4a77..f3c30fe122 100644 --- a/node-graph/graphene-cli/Cargo.toml +++ b/node-graph/graphene-cli/Cargo.toml @@ -21,7 +21,7 @@ gpu = [ [dependencies] # Local dependencies graphene-core = { workspace = true } -graphene-std = { workspace = true, features = ["serde"] } +graphene-std = { workspace = true } interpreted-executor = { workspace = true } graph-craft = { workspace = true, features = ["loading"] } diff --git a/node-graph/gstd/Cargo.toml b/node-graph/gstd/Cargo.toml index f5fec67b78..56e4f9b7ac 100644 --- a/node-graph/gstd/Cargo.toml +++ b/node-graph/gstd/Cargo.toml @@ -20,9 +20,9 @@ wayland = ["graph-craft/wayland"] [dependencies] # Local dependencies dyn-any = { workspace = true } -graph-craft = { workspace = true, features = ["serde"] } +graph-craft = { workspace = true } wgpu-executor = { workspace = true } -graphene-core = { workspace = true, features = ["serde"] } +graphene-core = { workspace = true } # Workspace dependencies fastnoise-lite = { workspace = true } @@ -45,7 +45,6 @@ wasm-bindgen = { workspace = true, optional = true } wasm-bindgen-futures = { workspace = true, optional = true } tokio = { workspace = true, optional = true } vello = { workspace = true, optional = true } -serde = { workspace = true, optional = true } web-sys = { workspace = true, optional = true, features = [ "Window", "CanvasRenderingContext2d", diff --git a/node-graph/gstd/src/imaginate.rs b/node-graph/gstd/src/imaginate.rs index 57296611a5..40ad1c7fee 100644 --- a/node-graph/gstd/src/imaginate.rs +++ b/node-graph/gstd/src/imaginate.rs @@ -178,20 +178,17 @@ impl core::fmt::Display for Error { impl std::error::Error for Error {} -#[derive(Default, Debug, Clone)] -#[cfg_attr(feature = "serde", derive(serde::Deserialize))] +#[derive(Default, Debug, Clone, serde::Deserialize)] struct ImageResponse { images: Vec, } -#[derive(Default, Debug, Clone)] -#[cfg_attr(feature = "serde", derive(serde::Deserialize))] +#[derive(Default, Debug, Clone, serde::Deserialize)] struct ProgressResponse { progress: f64, } -#[derive(Debug, Clone, Copy)] -#[cfg_attr(feature = "serde", derive(serde::Serialize))] +#[derive(Debug, Clone, Copy, serde::Serialize)] struct ImaginateTextToImageRequestOverrideSettings { show_progress_every_n_steps: u32, } @@ -204,8 +201,7 @@ impl Default for ImaginateTextToImageRequestOverrideSettings { } } -#[derive(Debug, Clone, Copy)] -#[cfg_attr(feature = "serde", derive(serde::Serialize))] +#[derive(Debug, Clone, Copy, serde::Serialize)] struct ImaginateImageToImageRequestOverrideSettings { show_progress_every_n_steps: u32, img2img_fix_steps: bool, @@ -220,16 +216,14 @@ impl Default for ImaginateImageToImageRequestOverrideSettings { } } -#[derive(Debug, Clone)] -#[cfg_attr(feature = "serde", derive(serde::Serialize))] +#[derive(Debug, Clone, serde::Serialize)] struct ImaginateTextToImageRequest<'a> { - #[cfg_attr(feature = "serde", serde(flatten))] + #[serde(flatten)] common: ImaginateCommonImageRequest<'a>, override_settings: ImaginateTextToImageRequestOverrideSettings, } -#[derive(Debug, Clone)] -#[cfg_attr(feature = "serde", derive(serde::Serialize))] +#[derive(Debug, Clone, serde::Serialize)] struct ImaginateMask { mask: String, mask_blur: String, @@ -238,21 +232,19 @@ struct ImaginateMask { inpainting_mask_invert: u32, } -#[derive(Debug, Clone)] -#[cfg_attr(feature = "serde", derive(serde::Serialize))] +#[derive(Debug, Clone, serde::Serialize)] struct ImaginateImageToImageRequest<'a> { - #[cfg_attr(feature = "serde", serde(flatten))] + #[serde(flatten)] common: ImaginateCommonImageRequest<'a>, override_settings: ImaginateImageToImageRequestOverrideSettings, init_images: Vec, denoising_strength: f64, - #[cfg_attr(feature = "serde", serde(flatten))] + #[serde(flatten)] mask: Option, } -#[derive(Debug, Clone)] -#[cfg_attr(feature = "serde", derive(serde::Serialize))] +#[derive(Debug, Clone, serde::Serialize)] struct ImaginateCommonImageRequest<'a> { prompt: String, seed: f64, diff --git a/node-graph/gstd/src/raster.rs b/node-graph/gstd/src/raster.rs index 55f2792ce1..d6294d14f9 100644 --- a/node-graph/gstd/src/raster.rs +++ b/node-graph/gstd/src/raster.rs @@ -305,7 +305,6 @@ fn image_value(_: impl Ctx, _primary: (), image: RasterDataTable) -> Raster image } -// #[cfg(feature = "serde")] // macro_rules! generate_imaginate_node { // ($($val:ident: $t:ident: $o:ty,)*) => { // pub struct ImaginateNode { @@ -386,7 +385,6 @@ fn image_value(_: impl Ctx, _primary: (), image: RasterDataTable) -> Raster // } // } -// #[cfg(feature = "serde")] // generate_imaginate_node! { // seed: Seed: f64, // res: Res: Option, diff --git a/node-graph/interpreted-executor/Cargo.toml b/node-graph/interpreted-executor/Cargo.toml index b4f059a24e..f862c0419b 100644 --- a/node-graph/interpreted-executor/Cargo.toml +++ b/node-graph/interpreted-executor/Cargo.toml @@ -6,12 +6,11 @@ license = "MIT OR Apache-2.0" [features] default = [] -serde = ["dep:serde", "graphene-std/serde", "glam/serde"] gpu = ["graphene-std/gpu", "graphene-std/wgpu"] [dependencies] # Local dependencies -graphene-std = { workspace = true, features = ["serde"] } +graphene-std = { workspace = true } graph-craft = { workspace = true } wgpu-executor = { workspace = true } graphene-core = { workspace = true } @@ -22,9 +21,7 @@ log = { workspace = true } glam = { workspace = true } futures = { workspace = true } once_cell = { workspace = true } - -# Optional workspace dependencies -serde = { workspace = true, optional = true } +serde = { workspace = true } [dev-dependencies] # Workspace dependencies diff --git a/node-graph/interpreted-executor/src/dynamic_executor.rs b/node-graph/interpreted-executor/src/dynamic_executor.rs index 089b936074..f162bd1779 100644 --- a/node-graph/interpreted-executor/src/dynamic_executor.rs +++ b/node-graph/interpreted-executor/src/dynamic_executor.rs @@ -33,23 +33,20 @@ impl Default for DynamicExecutor { } } -#[derive(PartialEq, Clone, Debug, Default)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(PartialEq, Clone, Debug, Default, serde::Serialize, serde::Deserialize)] pub struct NodeTypes { pub inputs: Vec, pub output: Type, } -#[derive(PartialEq, Clone, Debug, Default)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(PartialEq, Clone, Debug, Default, serde::Serialize, serde::Deserialize)] pub struct ResolvedDocumentNodeTypes { pub types: HashMap, NodeTypes>, } type Path = Box<[NodeId]>; -#[derive(PartialEq, Clone, Debug, Default)] -#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(PartialEq, Clone, Debug, Default, serde::Serialize, serde::Deserialize)] pub struct ResolvedDocumentNodeTypesDelta { pub add: Vec<(Path, NodeTypes)>, pub remove: Vec, From 8e5abf65cbb67ded6aa4a733f1f723a092a9cc9c Mon Sep 17 00:00:00 2001 From: 0SlowPoke0 <142654792+0SlowPoke0@users.noreply.github.com> Date: Sun, 22 Jun 2025 13:23:49 +0530 Subject: [PATCH 05/44] Add star/polygon gizmos and refactor the separate shape drawing tools into a unified Shape tool (#2683) * no trait ,not to fix line * add hints * line modification even when other shapes are selected * added transform and anchor overlays * removed old code * fixed transform added hints need to fix modifier keys use * refactored select-tool * add point-handle-gizmo * fix rotate bug * implement angle snapping gizmo , fix overlay and refactor the code * implement snapping for point-handle gizmo and implement no of point gizmo need to refactor * implemented the gizmo for polygon, added tests , brackets to increase sides * formatting-fix * small nit-picks * Make it compile * Code review --------- Co-authored-by: Keavon Chambers --- Cargo.lock | 1 + editor/Cargo.toml | 1 + editor/src/consts.rs | 7 + .../messages/input_mapper/input_mappings.rs | 69 +- .../document/document_message_handler.rs | 15 + editor/src/messages/prelude.rs | 5 +- .../messages/tool/common_functionality/mod.rs | 2 + .../tool/common_functionality/resize.rs | 2 +- .../common_functionality/shape_gizmos/mod.rs | 2 + .../shape_gizmos/number_of_points_handle.rs | 241 +++++ .../shape_gizmos/point_radius_handle.rs | 441 ++++++++ .../shapes/ellipse_shape.rs | 181 ++++ .../common_functionality/shapes/line_shape.rs | 383 +++++++ .../tool/common_functionality/shapes/mod.rs | 11 + .../shapes/polygon_shape.rs | 68 ++ .../shapes/rectangle_shape.rs | 54 + .../shapes/shape_utility.rs | 320 ++++++ .../common_functionality/shapes/star_shape.rs | 78 ++ .../tool/common_functionality/snapping.rs | 4 + .../snapping/alignment_snapper.rs | 2 +- .../common_functionality/utility_functions.rs | 230 ++++- editor/src/messages/tool/tool_message.rs | 18 +- .../src/messages/tool/tool_message_handler.rs | 49 +- .../tool/tool_messages/ellipse_tool.rs | 444 -------- .../tool/tool_messages/gradient_tool.rs | 3 +- .../messages/tool/tool_messages/line_tool.rs | 624 ----------- editor/src/messages/tool/tool_messages/mod.rs | 5 +- .../tool/tool_messages/polygon_tool.rs | 436 -------- .../tool/tool_messages/rectangle_tool.rs | 323 ------ .../tool/tool_messages/select_tool.rs | 268 ++--- .../messages/tool/tool_messages/shape_tool.rs | 966 ++++++++++++++++++ .../transform_layer_message_handler.rs | 6 +- editor/src/messages/tool/utility_types.rs | 100 +- editor/src/test_utils.rs | 9 +- 34 files changed, 3231 insertions(+), 2137 deletions(-) create mode 100644 editor/src/messages/tool/common_functionality/shape_gizmos/mod.rs create mode 100644 editor/src/messages/tool/common_functionality/shape_gizmos/number_of_points_handle.rs create mode 100644 editor/src/messages/tool/common_functionality/shape_gizmos/point_radius_handle.rs create mode 100644 editor/src/messages/tool/common_functionality/shapes/ellipse_shape.rs create mode 100644 editor/src/messages/tool/common_functionality/shapes/line_shape.rs create mode 100644 editor/src/messages/tool/common_functionality/shapes/mod.rs create mode 100644 editor/src/messages/tool/common_functionality/shapes/polygon_shape.rs create mode 100644 editor/src/messages/tool/common_functionality/shapes/rectangle_shape.rs create mode 100644 editor/src/messages/tool/common_functionality/shapes/shape_utility.rs create mode 100644 editor/src/messages/tool/common_functionality/shapes/star_shape.rs delete mode 100644 editor/src/messages/tool/tool_messages/ellipse_tool.rs delete mode 100644 editor/src/messages/tool/tool_messages/line_tool.rs delete mode 100644 editor/src/messages/tool/tool_messages/polygon_tool.rs delete mode 100644 editor/src/messages/tool/tool_messages/rectangle_tool.rs create mode 100644 editor/src/messages/tool/tool_messages/shape_tool.rs diff --git a/Cargo.lock b/Cargo.lock index 92b87cd829..22ad5e1e8c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2264,6 +2264,7 @@ dependencies = [ "graphite-proc-macros", "interpreted-executor", "js-sys", + "kurbo", "log", "num_enum", "once_cell", diff --git a/editor/Cargo.toml b/editor/Cargo.toml index 78791a1a91..31e54a7a16 100644 --- a/editor/Cargo.toml +++ b/editor/Cargo.toml @@ -40,6 +40,7 @@ serde_json = { workspace = true } bezier-rs = { workspace = true } futures = { workspace = true } glam = { workspace = true } +kurbo = { workspace = true } derivative = { workspace = true } specta = { workspace = true } dyn-any = { workspace = true } diff --git a/editor/src/consts.rs b/editor/src/consts.rs index 144ddd6757..19edd48afd 100644 --- a/editor/src/consts.rs +++ b/editor/src/consts.rs @@ -119,6 +119,13 @@ pub const LINE_ROTATE_SNAP_ANGLE: f64 = 15.; pub const BRUSH_SIZE_CHANGE_KEYBOARD: f64 = 5.; pub const DEFAULT_BRUSH_SIZE: f64 = 20.; +// GIZMOS +pub const POINT_RADIUS_HANDLE_SNAP_THRESHOLD: f64 = 8.; +pub const POINT_RADIUS_HANDLE_SEGMENT_THRESHOLD: f64 = 7.9; +pub const NUMBER_OF_POINTS_HANDLE_SPOKE_EXTENSION: f64 = 1.2; +pub const NUMBER_OF_POINTS_HANDLE_SPOKE_LENGTH: f64 = 10.; +pub const GIZMO_HIDE_THRESHOLD: f64 = 20.; + // SCROLLBARS pub const SCROLLBAR_SPACING: f64 = 0.1; pub const ASYMPTOTIC_EFFECT: f64 = 0.5; diff --git a/editor/src/messages/input_mapper/input_mappings.rs b/editor/src/messages/input_mapper/input_mappings.rs index 024480f2d4..46854dc760 100644 --- a/editor/src/messages/input_mapper/input_mappings.rs +++ b/editor/src/messages/input_mapper/input_mappings.rs @@ -171,12 +171,40 @@ pub fn input_mappings() -> Mapping { entry!(KeyDown(MouseRight); action_dispatch=GradientToolMessage::Abort), entry!(KeyDown(Escape); action_dispatch=GradientToolMessage::Abort), // - // RectangleToolMessage - entry!(KeyDown(MouseLeft); action_dispatch=RectangleToolMessage::DragStart), - entry!(KeyUp(MouseLeft); action_dispatch=RectangleToolMessage::DragStop), - entry!(KeyDown(MouseRight); action_dispatch=RectangleToolMessage::Abort), - entry!(KeyDown(Escape); action_dispatch=RectangleToolMessage::Abort), - entry!(PointerMove; refresh_keys=[Alt, Shift], action_dispatch=RectangleToolMessage::PointerMove { center: Alt, lock_ratio: Shift }), + // ShapeToolMessage + entry!(KeyDown(MouseLeft); action_dispatch=ShapeToolMessage::DragStart), + entry!(KeyUp(MouseLeft); action_dispatch=ShapeToolMessage::DragStop), + entry!(KeyDown(MouseRight); action_dispatch=ShapeToolMessage::Abort), + entry!(KeyDown(Escape); action_dispatch=ShapeToolMessage::Abort), + entry!(KeyDown(BracketLeft); action_dispatch=ShapeToolMessage::DecreaseSides), + entry!(KeyDown(BracketRight); action_dispatch=ShapeToolMessage::IncreaseSides), + entry!(PointerMove; refresh_keys=[Alt, Shift, Control], action_dispatch=ShapeToolMessage::PointerMove([Alt, Shift, Control, Shift])), + entry!(KeyDown(ArrowUp); modifiers=[Shift, ArrowLeft], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: -BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }), + entry!(KeyDown(ArrowUp); modifiers=[Shift, ArrowRight], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }), + entry!(KeyDown(ArrowUp); modifiers=[Shift], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: 0., delta_y: -BIG_NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }), + entry!(KeyDown(ArrowDown); modifiers=[Shift, ArrowLeft], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: -BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }), + entry!(KeyDown(ArrowDown); modifiers=[Shift, ArrowRight], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }), + entry!(KeyDown(ArrowDown); modifiers=[Shift], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: 0., delta_y: BIG_NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }), + entry!(KeyDown(ArrowLeft); modifiers=[Shift, ArrowUp], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: -BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }), + entry!(KeyDown(ArrowLeft); modifiers=[Shift, ArrowDown], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: -BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }), + entry!(KeyDown(ArrowLeft); modifiers=[Shift], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: -BIG_NUDGE_AMOUNT, delta_y: 0., resize: Alt, resize_opposite_corner: Control }), + entry!(KeyDown(ArrowRight); modifiers=[Shift, ArrowUp], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: BIG_NUDGE_AMOUNT, delta_y: -BIG_NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }), + entry!(KeyDown(ArrowRight); modifiers=[Shift, ArrowDown], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: BIG_NUDGE_AMOUNT, delta_y: BIG_NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }), + entry!(KeyDown(ArrowRight); modifiers=[Shift], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: BIG_NUDGE_AMOUNT, delta_y: 0., resize: Alt, resize_opposite_corner: Control }), + entry!(KeyDown(ArrowUp); modifiers=[ArrowLeft], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: -NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }), + entry!(KeyDown(ArrowUp); modifiers=[ArrowRight], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }), + entry!(KeyDown(ArrowUp); action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: 0., delta_y: -NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }), + entry!(KeyDown(ArrowDown); modifiers=[ArrowLeft], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: -NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }), + entry!(KeyDown(ArrowDown); modifiers=[ArrowRight], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }), + entry!(KeyDown(ArrowDown); action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: 0., delta_y: NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }), + entry!(KeyDown(ArrowLeft); modifiers=[ArrowUp], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: -NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }), + entry!(KeyDown(ArrowLeft); modifiers=[ArrowDown], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: -NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }), + entry!(KeyDown(ArrowLeft); action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: -NUDGE_AMOUNT, delta_y: 0., resize: Alt, resize_opposite_corner: Control }), + entry!(KeyDown(ArrowRight); modifiers=[ArrowUp], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: NUDGE_AMOUNT, delta_y: -NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }), + entry!(KeyDown(ArrowRight); modifiers=[ArrowDown], action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: NUDGE_AMOUNT, delta_y: NUDGE_AMOUNT, resize: Alt, resize_opposite_corner: Control }), + entry!(KeyDown(ArrowRight); action_dispatch=ShapeToolMessage::NudgeSelectedLayers { delta_x: NUDGE_AMOUNT, delta_y: 0., resize: Alt, resize_opposite_corner: Control }), + entry!(KeyDown(ArrowUp); action_dispatch=ShapeToolMessage::IncreaseSides), + entry!(KeyDown(ArrowDown); action_dispatch=ShapeToolMessage::DecreaseSides), // // ImaginateToolMessage // entry!(KeyDown(MouseLeft); action_dispatch=ImaginateToolMessage::DragStart), @@ -185,27 +213,6 @@ pub fn input_mappings() -> Mapping { // entry!(KeyDown(Escape); action_dispatch=ImaginateToolMessage::Abort), // entry!(PointerMove; refresh_keys=[Alt, Shift], action_dispatch=ImaginateToolMessage::Resize { center: Alt, lock_ratio: Shift }), // - // EllipseToolMessage - entry!(KeyDown(MouseLeft); action_dispatch=EllipseToolMessage::DragStart), - entry!(KeyUp(MouseLeft); action_dispatch=EllipseToolMessage::DragStop), - entry!(KeyDown(MouseRight); action_dispatch=EllipseToolMessage::Abort), - entry!(KeyDown(Escape); action_dispatch=EllipseToolMessage::Abort), - entry!(PointerMove; refresh_keys=[Alt, Shift], action_dispatch=EllipseToolMessage::PointerMove { center: Alt, lock_ratio: Shift }), - // - // PolygonToolMessage - entry!(KeyDown(MouseLeft); action_dispatch=PolygonToolMessage::DragStart), - entry!(KeyUp(MouseLeft); action_dispatch=PolygonToolMessage::DragStop), - entry!(KeyDown(MouseRight); action_dispatch=PolygonToolMessage::Abort), - entry!(KeyDown(Escape); action_dispatch=PolygonToolMessage::Abort), - entry!(PointerMove; refresh_keys=[Alt, Shift], action_dispatch=PolygonToolMessage::PointerMove { center: Alt, lock_ratio: Shift }), - // - // LineToolMessage - entry!(KeyDown(MouseLeft); action_dispatch=LineToolMessage::DragStart), - entry!(KeyUp(MouseLeft); action_dispatch=LineToolMessage::DragStop), - entry!(KeyDown(MouseRight); action_dispatch=LineToolMessage::Abort), - entry!(KeyDown(Escape); action_dispatch=LineToolMessage::Abort), - entry!(PointerMove; refresh_keys=[Control, Alt, Shift], action_dispatch=LineToolMessage::PointerMove { center: Alt, lock_angle: Control, snap_angle: Shift }), - // // PathToolMessage entry!(KeyDown(Delete); modifiers=[Accel], action_dispatch=PathToolMessage::DeleteAndBreakPath), entry!(KeyDown(Backspace); modifiers=[Accel], action_dispatch=PathToolMessage::DeleteAndBreakPath), @@ -308,10 +315,10 @@ pub fn input_mappings() -> Mapping { entry!(KeyDown(KeyA); action_dispatch=ToolMessage::ActivateToolPath), entry!(KeyDown(KeyP); action_dispatch=ToolMessage::ActivateToolPen), entry!(KeyDown(KeyN); action_dispatch=ToolMessage::ActivateToolFreehand), - entry!(KeyDown(KeyL); action_dispatch=ToolMessage::ActivateToolLine), - entry!(KeyDown(KeyM); action_dispatch=ToolMessage::ActivateToolRectangle), - entry!(KeyDown(KeyE); action_dispatch=ToolMessage::ActivateToolEllipse), - entry!(KeyDown(KeyY); action_dispatch=ToolMessage::ActivateToolPolygon), + entry!(KeyDown(KeyL); action_dispatch=ToolMessage::ActivateToolShapeLine), + entry!(KeyDown(KeyM); action_dispatch=ToolMessage::ActivateToolShapeRectangle), + entry!(KeyDown(KeyE); action_dispatch=ToolMessage::ActivateToolShapeEllipse), + entry!(KeyDown(KeyY); action_dispatch=ToolMessage::ActivateToolShape), entry!(KeyDown(KeyB); action_dispatch=ToolMessage::ActivateToolBrush), entry!(KeyDown(KeyX); modifiers=[Accel, Shift], action_dispatch=ToolMessage::ResetColors), entry!(KeyDown(KeyX); modifiers=[Shift], action_dispatch=ToolMessage::SwapColors), diff --git a/editor/src/messages/portfolio/document/document_message_handler.rs b/editor/src/messages/portfolio/document/document_message_handler.rs index 21906fac46..8e7b1c39cd 100644 --- a/editor/src/messages/portfolio/document/document_message_handler.rs +++ b/editor/src/messages/portfolio/document/document_message_handler.rs @@ -1705,6 +1705,21 @@ impl DocumentMessageHandler { self.click_list(ipp).last() } + pub fn click_based_on_position(&self, mouse_snapped_positon: DVec2) -> Option { + ClickXRayIter::new(&self.network_interface, XRayTarget::Point(mouse_snapped_positon)) + .filter(move |&layer| !self.network_interface.is_artboard(&layer.to_node(), &[])) + .skip_while(|&layer| layer == LayerNodeIdentifier::ROOT_PARENT) + .scan(true, |last_had_children, layer| { + if *last_had_children { + *last_had_children = layer.has_children(self.network_interface.document_metadata()); + Some(layer) + } else { + None + } + }) + .last() + } + /// Get the combined bounding box of the click targets of the selected visible layers in viewport space pub fn selected_visible_layers_bounding_box_viewport(&self) -> Option<[DVec2; 2]> { self.network_interface diff --git a/editor/src/messages/prelude.rs b/editor/src/messages/prelude.rs index 8c03ac51fe..eb6900a53f 100644 --- a/editor/src/messages/prelude.rs +++ b/editor/src/messages/prelude.rs @@ -34,19 +34,16 @@ pub use crate::messages::broadcast::broadcast_event::{BroadcastEvent, BroadcastE pub use crate::messages::message::{Message, MessageDiscriminant}; pub use crate::messages::tool::tool_messages::artboard_tool::{ArtboardToolMessage, ArtboardToolMessageDiscriminant}; pub use crate::messages::tool::tool_messages::brush_tool::{BrushToolMessage, BrushToolMessageDiscriminant}; -pub use crate::messages::tool::tool_messages::ellipse_tool::{EllipseToolMessage, EllipseToolMessageDiscriminant}; pub use crate::messages::tool::tool_messages::eyedropper_tool::{EyedropperToolMessage, EyedropperToolMessageDiscriminant}; pub use crate::messages::tool::tool_messages::fill_tool::{FillToolMessage, FillToolMessageDiscriminant}; pub use crate::messages::tool::tool_messages::freehand_tool::{FreehandToolMessage, FreehandToolMessageDiscriminant}; pub use crate::messages::tool::tool_messages::gradient_tool::{GradientToolMessage, GradientToolMessageDiscriminant}; // pub use crate::messages::tool::tool_messages::imaginate_tool::{ImaginateToolMessage, ImaginateToolMessageDiscriminant}; -pub use crate::messages::tool::tool_messages::line_tool::{LineToolMessage, LineToolMessageDiscriminant}; pub use crate::messages::tool::tool_messages::navigate_tool::{NavigateToolMessage, NavigateToolMessageDiscriminant}; pub use crate::messages::tool::tool_messages::path_tool::{PathToolMessage, PathToolMessageDiscriminant}; pub use crate::messages::tool::tool_messages::pen_tool::{PenToolMessage, PenToolMessageDiscriminant}; -pub use crate::messages::tool::tool_messages::polygon_tool::{PolygonToolMessage, PolygonToolMessageDiscriminant}; -pub use crate::messages::tool::tool_messages::rectangle_tool::{RectangleToolMessage, RectangleToolMessageDiscriminant}; pub use crate::messages::tool::tool_messages::select_tool::{SelectToolMessage, SelectToolMessageDiscriminant}; +pub use crate::messages::tool::tool_messages::shape_tool::{ShapeToolMessage, ShapeToolMessageDiscriminant}; pub use crate::messages::tool::tool_messages::spline_tool::{SplineToolMessage, SplineToolMessageDiscriminant}; pub use crate::messages::tool::tool_messages::text_tool::{TextToolMessage, TextToolMessageDiscriminant}; diff --git a/editor/src/messages/tool/common_functionality/mod.rs b/editor/src/messages/tool/common_functionality/mod.rs index 9bc2236061..4a003d0254 100644 --- a/editor/src/messages/tool/common_functionality/mod.rs +++ b/editor/src/messages/tool/common_functionality/mod.rs @@ -6,6 +6,8 @@ pub mod measure; pub mod pivot; pub mod resize; pub mod shape_editor; +pub mod shape_gizmos; +pub mod shapes; pub mod snapping; pub mod transformation_cage; pub mod utility_functions; diff --git a/editor/src/messages/tool/common_functionality/resize.rs b/editor/src/messages/tool/common_functionality/resize.rs index f81b13fed9..fc8f1ee6da 100644 --- a/editor/src/messages/tool/common_functionality/resize.rs +++ b/editor/src/messages/tool/common_functionality/resize.rs @@ -8,7 +8,7 @@ use glam::{DAffine2, DVec2, Vec2Swizzles}; #[derive(Clone, Debug, Default)] pub struct Resize { /// Stored as a document position so the start doesn't move if the canvas is panned. - drag_start: DVec2, + pub drag_start: DVec2, pub layer: Option, pub snap_manager: SnapManager, } diff --git a/editor/src/messages/tool/common_functionality/shape_gizmos/mod.rs b/editor/src/messages/tool/common_functionality/shape_gizmos/mod.rs new file mode 100644 index 0000000000..03951cd2d7 --- /dev/null +++ b/editor/src/messages/tool/common_functionality/shape_gizmos/mod.rs @@ -0,0 +1,2 @@ +pub mod number_of_points_handle; +pub mod point_radius_handle; diff --git a/editor/src/messages/tool/common_functionality/shape_gizmos/number_of_points_handle.rs b/editor/src/messages/tool/common_functionality/shape_gizmos/number_of_points_handle.rs new file mode 100644 index 0000000000..d698292ea4 --- /dev/null +++ b/editor/src/messages/tool/common_functionality/shape_gizmos/number_of_points_handle.rs @@ -0,0 +1,241 @@ +use crate::consts::{GIZMO_HIDE_THRESHOLD, NUMBER_OF_POINTS_HANDLE_SPOKE_EXTENSION, NUMBER_OF_POINTS_HANDLE_SPOKE_LENGTH, POINT_RADIUS_HANDLE_SEGMENT_THRESHOLD}; +use crate::messages::frontend::utility_types::MouseCursorIcon; +use crate::messages::message::Message; +use crate::messages::portfolio::document::overlays::utility_types::OverlayContext; +use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier; +use crate::messages::portfolio::document::utility_types::network_interface::InputConnector; +use crate::messages::prelude::Responses; +use crate::messages::prelude::{DocumentMessageHandler, FrontendMessage, InputPreprocessorMessageHandler, NodeGraphMessage}; +use crate::messages::tool::common_functionality::graph_modification_utils; +use crate::messages::tool::common_functionality::shape_editor::ShapeState; +use crate::messages::tool::common_functionality::shapes::shape_utility::{ + extract_polygon_parameters, extract_star_parameters, inside_polygon, inside_star, polygon_vertex_position, star_vertex_position, +}; +use crate::messages::tool::tool_messages::tool_prelude::Key; +use glam::{DAffine2, DVec2}; +use graph_craft::document::NodeInput; +use graph_craft::document::value::TaggedValue; +use std::collections::VecDeque; +use std::f64::consts::TAU; + +#[derive(Clone, Debug, Default, PartialEq)] +pub enum NumberOfPointsHandleState { + #[default] + Inactive, + Hover, + Dragging, +} + +#[derive(Clone, Debug, Default)] +pub struct NumberOfPointsHandle { + pub layer: Option, + pub initial_points: u32, + pub handle_state: NumberOfPointsHandleState, +} + +impl NumberOfPointsHandle { + pub fn cleanup(&mut self) { + self.handle_state = NumberOfPointsHandleState::Inactive; + self.layer = None; + } + + pub fn update_state(&mut self, state: NumberOfPointsHandleState) { + self.handle_state = state; + } + + pub fn is_hovering(&self) -> bool { + self.handle_state == NumberOfPointsHandleState::Hover + } + + pub fn is_dragging(&self) -> bool { + self.handle_state == NumberOfPointsHandleState::Dragging + } + + pub fn handle_actions( + &mut self, + document: &DocumentMessageHandler, + input: &InputPreprocessorMessageHandler, + mouse_position: DVec2, + overlay_context: &mut OverlayContext, + responses: &mut VecDeque, + ) { + if input.keyboard.key(Key::Control) { + return; + } + + match &self.handle_state { + NumberOfPointsHandleState::Inactive => { + let selected_nodes = document.network_interface.selected_nodes(); + let layers = selected_nodes.selected_visible_and_unlocked_layers(&document.network_interface).filter(|layer| { + graph_modification_utils::get_star_id(*layer, &document.network_interface).is_some() || graph_modification_utils::get_polygon_id(*layer, &document.network_interface).is_some() + }); + for layer in layers { + if let Some((n, radius1, radius2)) = extract_star_parameters(Some(layer), document) { + let viewport = document.metadata().transform_to_viewport(layer); + let center = viewport.transform_point2(DVec2::ZERO); + + let point_on_max_radius = star_vertex_position(viewport, 0, n, radius1, radius2); + + if mouse_position.distance(center) < NUMBER_OF_POINTS_HANDLE_SPOKE_LENGTH && point_on_max_radius.distance(center) > GIZMO_HIDE_THRESHOLD { + self.layer = Some(layer); + self.initial_points = n; + self.update_state(NumberOfPointsHandleState::Hover); + responses.add(FrontendMessage::UpdateMouseCursor { cursor: MouseCursorIcon::EWResize }); + } + } + + if let Some((n, radius)) = extract_polygon_parameters(Some(layer), document) { + let viewport = document.metadata().transform_to_viewport(layer); + let center = viewport.transform_point2(DVec2::ZERO); + + let point_on_max_radius = polygon_vertex_position(viewport, 0, n, radius); + + if mouse_position.distance(center) < NUMBER_OF_POINTS_HANDLE_SPOKE_LENGTH && point_on_max_radius.distance(center) > GIZMO_HIDE_THRESHOLD { + self.layer = Some(layer); + self.initial_points = n; + self.update_state(NumberOfPointsHandleState::Hover); + responses.add(FrontendMessage::UpdateMouseCursor { cursor: MouseCursorIcon::EWResize }); + } + } + } + } + NumberOfPointsHandleState::Hover | NumberOfPointsHandleState::Dragging => { + let Some(layer) = self.layer else { return }; + + let Some((n, radius)) = extract_star_parameters(Some(layer), document) + .map(|(n, r1, r2)| (n, r1.max(r2))) + .or_else(|| extract_polygon_parameters(Some(layer), document)) + else { + return; + }; + + let viewport = document.metadata().transform_to_viewport(layer); + let center = viewport.transform_point2(DVec2::ZERO); + + if mouse_position.distance(center) > NUMBER_OF_POINTS_HANDLE_SPOKE_LENGTH && matches!(&self.handle_state, NumberOfPointsHandleState::Hover) { + self.update_state(NumberOfPointsHandleState::Inactive); + self.layer = None; + self.draw_spokes(center, viewport, n, radius, overlay_context); + responses.add(FrontendMessage::UpdateMouseCursor { cursor: MouseCursorIcon::Default }); + } + } + } + } + + pub fn overlays( + &mut self, + document: &DocumentMessageHandler, + input: &InputPreprocessorMessageHandler, + shape_editor: &mut &mut ShapeState, + mouse_position: DVec2, + overlay_context: &mut OverlayContext, + ) { + if input.keyboard.key(Key::Control) { + return; + } + + match &self.handle_state { + NumberOfPointsHandleState::Inactive => { + let selected_nodes = document.network_interface.selected_nodes(); + let layers = selected_nodes.selected_visible_and_unlocked_layers(&document.network_interface).filter(|layer| { + graph_modification_utils::get_star_id(*layer, &document.network_interface).is_some() || graph_modification_utils::get_polygon_id(*layer, &document.network_interface).is_some() + }); + for layer in layers { + if let Some((n, radius1, radius2)) = extract_star_parameters(Some(layer), document) { + let radius = radius1.max(radius2); + let viewport = document.metadata().transform_to_viewport(layer); + let center = viewport.transform_point2(DVec2::ZERO); + + if let Some(closest_segment) = shape_editor.upper_closest_segment(&document.network_interface, mouse_position, POINT_RADIUS_HANDLE_SEGMENT_THRESHOLD) { + if closest_segment.layer() == layer { + return; + } + } + let point_on_max_radius = star_vertex_position(viewport, 0, n, radius1, radius2); + + if inside_star(viewport, n, radius1, radius2, mouse_position) && point_on_max_radius.distance(center) > GIZMO_HIDE_THRESHOLD { + self.draw_spokes(center, viewport, n, radius, overlay_context); + return; + } + } + + if let Some((n, radius)) = extract_polygon_parameters(Some(layer), document) { + let viewport = document.metadata().transform_to_viewport(layer); + let center = viewport.transform_point2(DVec2::ZERO); + + if let Some(closest_segment) = shape_editor.upper_closest_segment(&document.network_interface, mouse_position, POINT_RADIUS_HANDLE_SEGMENT_THRESHOLD) { + if closest_segment.layer() == layer { + return; + } + } + let point_on_max_radius = polygon_vertex_position(viewport, 0, n, radius); + + if inside_polygon(viewport, n, radius, mouse_position) && point_on_max_radius.distance(center) > GIZMO_HIDE_THRESHOLD { + self.draw_spokes(center, viewport, n, radius, overlay_context); + return; + } + } + } + } + NumberOfPointsHandleState::Hover | NumberOfPointsHandleState::Dragging => { + let Some(layer) = self.layer else { return }; + + let Some((n, radius)) = extract_star_parameters(Some(layer), document) + .map(|(n, r1, r2)| (n, r1.max(r2))) + .or_else(|| extract_polygon_parameters(Some(layer), document)) + else { + return; + }; + + let viewport = document.metadata().transform_to_viewport(layer); + let center = viewport.transform_point2(DVec2::ZERO); + + self.draw_spokes(center, viewport, n, radius, overlay_context); + } + } + } + + fn draw_spokes(&self, center: DVec2, viewport: DAffine2, n: u32, radius: f64, overlay_context: &mut OverlayContext) { + for i in 0..n { + let angle = ((i as f64) * TAU) / (n as f64); + + let point = viewport.transform_point2(DVec2 { + x: radius * angle.sin(), + y: -radius * angle.cos(), + }); + + let Some(direction) = (point - center).try_normalize() else { continue }; + + // If the user zooms out such that shape is very small hide the gizmo + if point.distance(center) < GIZMO_HIDE_THRESHOLD { + return; + } + + let end_point = direction * NUMBER_OF_POINTS_HANDLE_SPOKE_LENGTH; + if matches!(self.handle_state, NumberOfPointsHandleState::Hover | NumberOfPointsHandleState::Dragging) { + overlay_context.line(center, end_point * NUMBER_OF_POINTS_HANDLE_SPOKE_EXTENSION + center, None, None); + } else { + overlay_context.line(center, end_point + center, None, None); + } + } + } + + pub fn update_number_of_sides(&self, document: &DocumentMessageHandler, input: &InputPreprocessorMessageHandler, responses: &mut VecDeque, drag_start: DVec2) { + let delta = input.mouse.position - document.metadata().document_to_viewport.transform_point2(drag_start); + let sign = (input.mouse.position.x - document.metadata().document_to_viewport.transform_point2(drag_start).x).signum(); + let net_delta = (delta.length() / 25.).round() * sign; + + let Some(layer) = self.layer else { return }; + let Some(node_id) = graph_modification_utils::get_star_id(layer, &document.network_interface).or(graph_modification_utils::get_polygon_id(layer, &document.network_interface)) else { + return; + }; + + let new_point_count = ((self.initial_points as i32) + (net_delta as i32)).max(3); + + responses.add(NodeGraphMessage::SetInput { + input_connector: InputConnector::node(node_id, 1), + input: NodeInput::value(TaggedValue::U32(new_point_count as u32), false), + }); + responses.add(NodeGraphMessage::RunDocumentGraph); + } +} diff --git a/editor/src/messages/tool/common_functionality/shape_gizmos/point_radius_handle.rs b/editor/src/messages/tool/common_functionality/shape_gizmos/point_radius_handle.rs new file mode 100644 index 0000000000..4a72de0319 --- /dev/null +++ b/editor/src/messages/tool/common_functionality/shape_gizmos/point_radius_handle.rs @@ -0,0 +1,441 @@ +use crate::consts::{COLOR_OVERLAY_RED, GIZMO_HIDE_THRESHOLD, POINT_RADIUS_HANDLE_SNAP_THRESHOLD}; +use crate::messages::message::Message; +use crate::messages::portfolio::document::overlays::utility_types::OverlayContext; +use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier; +use crate::messages::portfolio::document::utility_types::network_interface::InputConnector; +use crate::messages::prelude::Responses; +use crate::messages::prelude::{DocumentMessageHandler, InputPreprocessorMessageHandler, NodeGraphMessage}; +use crate::messages::tool::common_functionality::graph_modification_utils::{self, NodeGraphLayer}; +use crate::messages::tool::common_functionality::shapes::shape_utility::{draw_snapping_ticks, extract_polygon_parameters, extract_star_parameters, polygon_vertex_position, star_vertex_position}; +use glam::DVec2; +use graph_craft::document::NodeInput; +use graph_craft::document::value::TaggedValue; +use std::collections::VecDeque; +use std::f64::consts::{FRAC_1_SQRT_2, FRAC_PI_4, PI, SQRT_2}; + +#[derive(Clone, Debug, Default, PartialEq)] +pub enum PointRadiusHandleState { + #[default] + Inactive, + Hover, + Dragging, + Snapped(usize), +} + +#[derive(Clone, Debug, Default, PartialEq)] +pub struct PointRadiusHandle { + pub layer: Option, + point: u32, + radius_index: usize, + snap_radii: Vec, + initial_radius: f64, + handle_state: PointRadiusHandleState, +} + +impl PointRadiusHandle { + pub fn cleanup(&mut self) { + self.handle_state = PointRadiusHandleState::Inactive; + self.snap_radii.clear(); + self.layer = None; + } + + pub fn is_inactive(&self) -> bool { + self.handle_state == PointRadiusHandleState::Inactive + } + + pub fn hovered(&self) -> bool { + self.handle_state == PointRadiusHandleState::Hover + } + + pub fn update_state(&mut self, state: PointRadiusHandleState) { + self.handle_state = state; + } + + pub fn handle_actions(&mut self, document: &DocumentMessageHandler, mouse_position: DVec2) { + match &self.handle_state { + PointRadiusHandleState::Inactive => { + for layer in document + .network_interface + .selected_nodes() + .selected_visible_and_unlocked_layers(&document.network_interface) + .filter(|layer| { + graph_modification_utils::get_star_id(*layer, &document.network_interface).is_some() || graph_modification_utils::get_polygon_id(*layer, &document.network_interface).is_some() + }) { + // Draw the point handle gizmo for the star shape + if let Some((n, radius1, radius2)) = extract_star_parameters(Some(layer), document) { + let viewport = document.metadata().transform_to_viewport(layer); + + for i in 0..2 * n { + let (radius, radius_index) = if i % 2 == 0 { (radius1, 2) } else { (radius2, 3) }; + let point = star_vertex_position(viewport, i as i32, n, radius1, radius2); + let center = viewport.transform_point2(DVec2::ZERO); + + // If the user zooms out such that shape is very small hide the gizmo + if point.distance(center) < GIZMO_HIDE_THRESHOLD { + return; + } + + if point.distance(mouse_position) < 5. { + self.radius_index = radius_index; + self.layer = Some(layer); + self.point = i; + self.snap_radii = Self::calculate_snap_radii(document, layer, radius_index); + self.initial_radius = radius; + self.update_state(PointRadiusHandleState::Hover); + + return; + } + } + } + + // Draw the point handle gizmo for the polygon shape + if let Some((n, radius)) = extract_polygon_parameters(Some(layer), document) { + let viewport = document.metadata().transform_to_viewport(layer); + + for i in 0..n { + let point = polygon_vertex_position(viewport, i as i32, n, radius); + let center = viewport.transform_point2(DVec2::ZERO); + + // If the user zooms out so the shape is very small, hide the gizmo + if point.distance(center) < GIZMO_HIDE_THRESHOLD { + return; + } + + if point.distance(mouse_position) < 5. { + self.radius_index = 2; + self.layer = Some(layer); + self.point = i; + self.snap_radii.clear(); + self.initial_radius = radius; + self.update_state(PointRadiusHandleState::Hover); + + return; + } + } + } + } + } + + PointRadiusHandleState::Dragging | PointRadiusHandleState::Hover => { + let Some(layer) = self.layer else { return }; + + let viewport = document.metadata().transform_to_viewport(layer); + + if let Some((n, radius1, radius2)) = extract_star_parameters(Some(layer), document) { + let point = star_vertex_position(viewport, self.point as i32, n, radius1, radius2); + + if matches!(&self.handle_state, PointRadiusHandleState::Hover) && (mouse_position - point).length() > 5. { + self.update_state(PointRadiusHandleState::Inactive); + self.layer = None; + return; + } + } + + if let Some((n, radius)) = extract_polygon_parameters(Some(layer), document) { + let point = polygon_vertex_position(viewport, self.point as i32, n, radius); + + if matches!(&self.handle_state, PointRadiusHandleState::Hover) && (mouse_position - point).length() > 5. { + self.update_state(PointRadiusHandleState::Inactive); + self.layer = None; + } + } + } + PointRadiusHandleState::Snapped(_) => {} + } + } + + pub fn overlays(&mut self, other_gizmo_active: bool, document: &DocumentMessageHandler, input: &InputPreprocessorMessageHandler, mouse_position: DVec2, overlay_context: &mut OverlayContext) { + match &self.handle_state { + PointRadiusHandleState::Inactive => { + let selected_nodes = document.network_interface.selected_nodes(); + let layers = selected_nodes.selected_visible_and_unlocked_layers(&document.network_interface).filter(|layer| { + graph_modification_utils::get_star_id(*layer, &document.network_interface).is_some() || graph_modification_utils::get_polygon_id(*layer, &document.network_interface).is_some() + }); + for layer in layers { + if other_gizmo_active { + return; + } + // Draw the point handle gizmo for the star shape + if let Some((n, radius1, radius2)) = extract_star_parameters(Some(layer), document) { + let viewport = document.metadata().transform_to_viewport(layer); + + for i in 0..(2 * n) { + let point = star_vertex_position(viewport, i as i32, n, radius1, radius2); + let center = viewport.transform_point2(DVec2::ZERO); + let viewport_diagonal = input.viewport_bounds.size().length(); + + // If the user zooms out such that shape is very small hide the gizmo + if point.distance(center) < GIZMO_HIDE_THRESHOLD { + return; + } + + if point.distance(mouse_position) < 5. { + let Some(direction) = (point - center).try_normalize() else { continue }; + + overlay_context.manipulator_handle(point, true, None); + let angle = ((i as f64) * PI) / (n as f64); + overlay_context.line(center, center + direction * viewport_diagonal, None, None); + + draw_snapping_ticks(&self.snap_radii, direction, viewport, angle, overlay_context); + + return; + } + + overlay_context.manipulator_handle(point, false, None); + } + } + + // Draw the point handle gizmo for the Polygon shape + if let Some((n, radius)) = extract_polygon_parameters(Some(layer), document) { + let viewport = document.metadata().transform_to_viewport(layer); + + for i in 0..n { + let point = polygon_vertex_position(viewport, i as i32, n, radius); + let center = viewport.transform_point2(DVec2::ZERO); + let viewport_diagonal = input.viewport_bounds.size().length(); + + // If the user zooms out such that shape is very small hide the gizmo + if point.distance(center) < GIZMO_HIDE_THRESHOLD { + return; + } + + if point.distance(mouse_position) < 5. { + let Some(direction) = (point - center).try_normalize() else { continue }; + + overlay_context.manipulator_handle(point, true, None); + overlay_context.line(center, center + direction * viewport_diagonal, None, None); + + return; + } + + overlay_context.manipulator_handle(point, false, None); + } + } + } + } + + PointRadiusHandleState::Dragging | PointRadiusHandleState::Hover => { + let Some(layer) = self.layer else { return }; + let viewport = document.metadata().transform_to_viewport(layer); + let center = viewport.transform_point2(DVec2::ZERO); + let viewport_diagonal = input.viewport_bounds.size().length(); + + if let Some((n, radius1, radius2)) = extract_star_parameters(Some(layer), document) { + let angle = ((self.point as f64) * PI) / (n as f64); + let point = star_vertex_position(viewport, self.point as i32, n, radius1, radius2); + + let Some(direction) = (point - center).try_normalize() else { return }; + + // Draws the ray from the center to the dragging point extending till the viewport + overlay_context.manipulator_handle(point, true, None); + overlay_context.line(center, center + direction * viewport_diagonal, None, None); + + // Makes the tick marks for snapping + + // Only show the snapping ticks if the radius is positive + if (mouse_position - center).dot(direction) >= 0. { + draw_snapping_ticks(&self.snap_radii, direction, viewport, angle, overlay_context); + } + + return; + } + + if let Some((n, radius)) = extract_polygon_parameters(Some(layer), document) { + let point = polygon_vertex_position(viewport, self.point as i32, n, radius); + + let Some(direction) = (point - center).try_normalize() else { return }; + + // Draws the ray from the center to the dragging point and extending until the viewport edge is reached + overlay_context.manipulator_handle(point, true, None); + overlay_context.line(center, center + direction * viewport_diagonal, None, None); + } + } + PointRadiusHandleState::Snapped(snapping_index) => { + let Some(layer) = self.layer else { return }; + let Some((n, radius1, radius2)) = extract_star_parameters(Some(layer), document) else { return }; + let viewport = document.metadata().transform_to_viewport(layer); + let center = viewport.transform_point2(DVec2::ZERO); + + match snapping_index { + // Make a triangle with the previous two points + 0 => { + let before_outer_position = star_vertex_position(viewport, (self.point as i32) - 2, n, radius1, radius2); + let outer_position = star_vertex_position(viewport, (self.point as i32) - 1, n, radius1, radius2); + let point_position = star_vertex_position(viewport, self.point as i32, n, radius1, radius2); + + overlay_context.line(before_outer_position, outer_position, Some(COLOR_OVERLAY_RED), Some(3.)); + overlay_context.line(outer_position, point_position, Some(COLOR_OVERLAY_RED), Some(3.)); + + let Some(l1_direction) = (before_outer_position - outer_position).try_normalize() else { return }; + let Some(l2_direction) = (point_position - outer_position).try_normalize() else { return }; + let Some(direction) = (center - outer_position).try_normalize() else { return }; + + let l1 = 0.2 * (before_outer_position - outer_position).length(); + let new_point = SQRT_2 * l1 * direction + outer_position; + + let before_outer_position = l1 * l1_direction + outer_position; + let point_position = l1 * l2_direction + outer_position; + + overlay_context.line(before_outer_position, new_point, Some(COLOR_OVERLAY_RED), Some(3.)); + overlay_context.line(new_point, point_position, Some(COLOR_OVERLAY_RED), Some(3.)); + } + 1 => { + let before_outer_position = star_vertex_position(viewport, (self.point as i32) - 1, n, radius1, radius2); + let after_point_position = star_vertex_position(viewport, (self.point as i32) + 1, n, radius1, radius2); + let point_position = star_vertex_position(viewport, self.point as i32, n, radius1, radius2); + + overlay_context.line(before_outer_position, point_position, Some(COLOR_OVERLAY_RED), Some(3.)); + overlay_context.line(point_position, after_point_position, Some(COLOR_OVERLAY_RED), Some(3.)); + + let Some(l1_direction) = (before_outer_position - point_position).try_normalize() else { return }; + let Some(l2_direction) = (after_point_position - point_position).try_normalize() else { return }; + let Some(direction) = (center - point_position).try_normalize() else { return }; + + let l1 = 0.2 * (before_outer_position - point_position).length(); + let new_point = SQRT_2 * l1 * direction + point_position; + + let before_outer_position = l1 * l1_direction + point_position; + let after_point_position = l1 * l2_direction + point_position; + + overlay_context.line(before_outer_position, new_point, Some(COLOR_OVERLAY_RED), Some(3.)); + overlay_context.line(new_point, after_point_position, Some(COLOR_OVERLAY_RED), Some(3.)); + } + i => { + // Use `self.point` as an absolute reference, as it matches the index of the star's vertices starting from 0 + if i % 2 != 0 { + // Flipped case + let point_position = star_vertex_position(viewport, self.point as i32, n, radius1, radius2); + let target_index = (1 - (*i as i32)).abs() + (self.point as i32); + let target_point_position = star_vertex_position(viewport, target_index, n, radius1, radius2); + + let mirrored_index = 2 * (self.point as i32) - target_index; + let mirrored = star_vertex_position(viewport, mirrored_index, n, radius1, radius2); + + overlay_context.line(point_position, target_point_position, Some(COLOR_OVERLAY_RED), Some(3.)); + overlay_context.line(point_position, mirrored, Some(COLOR_OVERLAY_RED), Some(3.)); + } else { + let outer_index = (self.point as i32) - 1; + let outer_position = star_vertex_position(viewport, outer_index, n, radius1, radius2); + + // The vertex which is colinear with the point we are dragging and its previous outer vertex + let target_index = (self.point as i32) + (*i as i32) - 1; + let target_point_position = star_vertex_position(viewport, target_index, n, radius1, radius2); + + let mirrored_index = 2 * outer_index - target_index; + + let mirrored = star_vertex_position(viewport, mirrored_index, n, radius1, radius2); + + overlay_context.line(outer_position, target_point_position, Some(COLOR_OVERLAY_RED), Some(3.)); + overlay_context.line(outer_position, mirrored, Some(COLOR_OVERLAY_RED), Some(3.)); + } + } + } + } + } + } + + fn calculate_snap_radii(document: &DocumentMessageHandler, layer: LayerNodeIdentifier, radius_index: usize) -> Vec { + let mut snap_radii = Vec::new(); + + let Some(node_inputs) = NodeGraphLayer::new(layer, &document.network_interface).find_node_inputs("Star") else { + return snap_radii; + }; + + let other_index = if radius_index == 3 { 2 } else { 3 }; + let Some(&TaggedValue::F64(other_radius)) = node_inputs[other_index].as_value() else { + return snap_radii; + }; + let Some(&TaggedValue::U32(n)) = node_inputs[1].as_value() else { + return snap_radii; + }; + + // Inner radius for 90° + let b = FRAC_PI_4 * 3. - PI / (n as f64); + let angle = b.sin(); + let required_radius = (other_radius / angle) * FRAC_1_SQRT_2; + + snap_radii.push(required_radius); + + // Also add the case where the radius exceeds the other radius (the "flipped" case) + let flipped = other_radius * angle * SQRT_2; + snap_radii.push(flipped); + + for i in 1..n { + let n = n as f64; + let i = i as f64; + let denominator = 2. * ((PI * (i - 1.)) / n).cos() * ((PI * i) / n).sin(); + let numerator = ((2. * PI * i) / n).sin(); + let factor = numerator / denominator; + + if factor < 0. { + break; + } + + if other_radius * factor > 1e-6 { + snap_radii.push(other_radius * factor); + } + + snap_radii.push((other_radius * 1.) / factor); + } + + snap_radii + } + + fn check_snapping(&self, new_radius: f64, original_radius: f64) -> Option<(usize, f64)> { + self.snap_radii + .iter() + .enumerate() + .filter(|(_, rad)| (**rad - new_radius).abs() < POINT_RADIUS_HANDLE_SNAP_THRESHOLD) + .min_by(|(i_a, a), (i_b, b)| { + let dist_a = (**a - new_radius).abs(); + let dist_b = (**b - new_radius).abs(); + + // Check if either index is 0 or 1 and prioritize them + match (*i_a == 0 || *i_a == 1, *i_b == 0 || *i_b == 1) { + (true, false) => std::cmp::Ordering::Less, // a is priority index, b is not + (false, true) => std::cmp::Ordering::Greater, // b is priority index, a is not + _ => dist_a.partial_cmp(&dist_b).unwrap_or(std::cmp::Ordering::Equal), // normal comparison + } + }) + .map(|(i, rad)| (i, *rad - original_radius)) + } + + pub fn update_inner_radius( + &mut self, + document: &DocumentMessageHandler, + input: &InputPreprocessorMessageHandler, + layer: LayerNodeIdentifier, + responses: &mut VecDeque, + drag_start: DVec2, + ) { + let Some(node_id) = graph_modification_utils::get_star_id(layer, &document.network_interface).or(graph_modification_utils::get_polygon_id(layer, &document.network_interface)) else { + return; + }; + + let transform = document.network_interface.document_metadata().transform_to_viewport(layer); + let center = transform.transform_point2(DVec2::ZERO); + let radius_index = self.radius_index; + + let original_radius = self.initial_radius; + + let delta = input.mouse.position - document.metadata().document_to_viewport.transform_point2(drag_start); + let radius = document.metadata().document_to_viewport.transform_point2(drag_start) - center; + let projection = delta.project_onto(radius); + let sign = radius.dot(delta).signum(); + + let mut net_delta = projection.length() * sign; + let new_radius = original_radius + net_delta; + + self.update_state(PointRadiusHandleState::Dragging); + if let Some((index, snapped_delta)) = self.check_snapping(new_radius, original_radius) { + net_delta = snapped_delta; + self.update_state(PointRadiusHandleState::Snapped(index)); + } + + responses.add(NodeGraphMessage::SetInput { + input_connector: InputConnector::node(node_id, radius_index), + input: NodeInput::value(TaggedValue::F64(original_radius + net_delta), false), + }); + responses.add(NodeGraphMessage::RunDocumentGraph); + } +} diff --git a/editor/src/messages/tool/common_functionality/shapes/ellipse_shape.rs b/editor/src/messages/tool/common_functionality/shapes/ellipse_shape.rs new file mode 100644 index 0000000000..fe97c22318 --- /dev/null +++ b/editor/src/messages/tool/common_functionality/shapes/ellipse_shape.rs @@ -0,0 +1,181 @@ +use super::shape_utility::ShapeToolModifierKey; +use super::*; +use crate::messages::portfolio::document::graph_operation::utility_types::TransformIn; +use crate::messages::portfolio::document::node_graph::document_node_definitions::resolve_document_node_type; +use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier; +use crate::messages::portfolio::document::utility_types::network_interface::{InputConnector, NodeTemplate}; +use crate::messages::tool::common_functionality::graph_modification_utils; +use crate::messages::tool::tool_messages::tool_prelude::*; +use glam::DAffine2; +use graph_craft::document::NodeInput; +use graph_craft::document::value::TaggedValue; +use std::collections::VecDeque; + +#[derive(Default)] +pub struct Ellipse; + +impl Ellipse { + pub fn create_node() -> NodeTemplate { + let node_type = resolve_document_node_type("Ellipse").expect("Ellipse node can't be found"); + node_type.node_template_input_override([None, Some(NodeInput::value(TaggedValue::F64(0.5), false)), Some(NodeInput::value(TaggedValue::F64(0.5), false))]) + } + + pub fn update_shape( + document: &DocumentMessageHandler, + ipp: &InputPreprocessorMessageHandler, + layer: LayerNodeIdentifier, + shape_tool_data: &mut ShapeToolData, + modifier: ShapeToolModifierKey, + responses: &mut VecDeque, + ) { + let [center, lock_ratio, _, _] = modifier; + + if let Some([start, end]) = shape_tool_data.data.calculate_points(document, ipp, center, lock_ratio) { + let Some(node_id) = graph_modification_utils::get_ellipse_id(layer, &document.network_interface) else { + return; + }; + + responses.add(NodeGraphMessage::SetInput { + input_connector: InputConnector::node(node_id, 1), + input: NodeInput::value(TaggedValue::F64(((start.x - end.x) / 2.).abs()), false), + }); + responses.add(NodeGraphMessage::SetInput { + input_connector: InputConnector::node(node_id, 2), + input: NodeInput::value(TaggedValue::F64(((start.y - end.y) / 2.).abs()), false), + }); + responses.add(GraphOperationMessage::TransformSet { + layer, + transform: DAffine2::from_translation(start.midpoint(end)), + transform_in: TransformIn::Viewport, + skip_rerender: false, + }); + } + } +} + +#[cfg(test)] +mod test_ellipse { + pub use crate::test_utils::test_prelude::*; + use glam::DAffine2; + use graphene_std::vector::generator_nodes::ellipse; + + #[derive(Debug, PartialEq)] + struct ResolvedEllipse { + radius_x: f64, + radius_y: f64, + transform: DAffine2, + } + + async fn get_ellipse(editor: &mut EditorTestUtils) -> Vec { + let instrumented = match editor.eval_graph().await { + Ok(instrumented) => instrumented, + Err(e) => panic!("Failed to evaluate graph: {e}"), + }; + + let document = editor.active_document(); + let layers = document.metadata().all_layers(); + layers + .filter_map(|layer| { + let node_graph_layer = NodeGraphLayer::new(layer, &document.network_interface); + let ellipse_node = node_graph_layer.upstream_node_id_from_protonode(ellipse::protonode_identifier())?; + Some(ResolvedEllipse { + radius_x: instrumented.grab_protonode_input::(&vec![ellipse_node], &editor.runtime).unwrap(), + radius_y: instrumented.grab_protonode_input::(&vec![ellipse_node], &editor.runtime).unwrap(), + transform: document.metadata().transform_to_document(layer), + }) + }) + .collect() + } + + #[tokio::test] + async fn ellipse_draw_simple() { + let mut editor = EditorTestUtils::create(); + editor.new_document().await; + editor.drag_tool(ToolType::Ellipse, 10., 10., 19., 0., ModifierKeys::empty()).await; + + assert_eq!(editor.active_document().metadata().all_layers().count(), 1); + + let ellipse = get_ellipse(&mut editor).await; + assert_eq!(ellipse.len(), 1); + assert_eq!( + ellipse[0], + ResolvedEllipse { + radius_x: 4.5, + radius_y: 5., + transform: DAffine2::from_translation(DVec2::new(14.5, 5.)) // Uses center + } + ); + } + + #[tokio::test] + async fn ellipse_draw_circle() { + let mut editor = EditorTestUtils::create(); + editor.new_document().await; + editor.drag_tool(ToolType::Ellipse, 10., 10., -10., 11., ModifierKeys::SHIFT).await; + + let ellipse = get_ellipse(&mut editor).await; + assert_eq!(ellipse.len(), 1); + assert_eq!( + ellipse[0], + ResolvedEllipse { + radius_x: 10., + radius_y: 10., + transform: DAffine2::from_translation(DVec2::new(0., 20.)) // Uses center + } + ); + } + + #[tokio::test] + async fn ellipse_draw_square_rotated() { + let mut editor = EditorTestUtils::create(); + editor.new_document().await; + editor + .handle_message(NavigationMessage::CanvasTiltSet { + // 45 degree rotation of content clockwise + angle_radians: f64::consts::FRAC_PI_4, + }) + .await; + editor.drag_tool(ToolType::Ellipse, 0., 0., 1., 10., ModifierKeys::SHIFT).await; // Viewport coordinates + + let ellipse = get_ellipse(&mut editor).await; + assert_eq!(ellipse.len(), 1); + println!("{ellipse:?}"); + assert_eq!(ellipse[0].radius_x, 5.); + assert_eq!(ellipse[0].radius_y, 5.); + + assert!( + ellipse[0] + .transform + .abs_diff_eq(DAffine2::from_angle_translation(-f64::consts::FRAC_PI_4, DVec2::X * f64::consts::FRAC_1_SQRT_2 * 10.), 0.001) + ); + } + + #[tokio::test] + async fn ellipse_draw_center_square_rotated() { + let mut editor = EditorTestUtils::create(); + editor.new_document().await; + editor + .handle_message(NavigationMessage::CanvasTiltSet { + // 45 degree rotation of content clockwise + angle_radians: f64::consts::FRAC_PI_4, + }) + .await; + editor.drag_tool(ToolType::Ellipse, 0., 0., 1., 10., ModifierKeys::SHIFT | ModifierKeys::ALT).await; // Viewport coordinates + + let ellipse = get_ellipse(&mut editor).await; + assert_eq!(ellipse.len(), 1); + assert_eq!(ellipse[0].radius_x, 10.); + assert_eq!(ellipse[0].radius_y, 10.); + assert!(ellipse[0].transform.abs_diff_eq(DAffine2::from_angle(-f64::consts::FRAC_PI_4), 0.001)); + } + + #[tokio::test] + async fn ellipse_cancel() { + let mut editor = EditorTestUtils::create(); + editor.new_document().await; + editor.drag_tool_cancel_rmb(ToolType::Ellipse).await; + + let ellipse = get_ellipse(&mut editor).await; + assert_eq!(ellipse.len(), 0); + } +} diff --git a/editor/src/messages/tool/common_functionality/shapes/line_shape.rs b/editor/src/messages/tool/common_functionality/shapes/line_shape.rs new file mode 100644 index 0000000000..985457c208 --- /dev/null +++ b/editor/src/messages/tool/common_functionality/shapes/line_shape.rs @@ -0,0 +1,383 @@ +use super::shape_utility::ShapeToolModifierKey; +use crate::consts::{BOUNDS_SELECT_THRESHOLD, LINE_ROTATE_SNAP_ANGLE}; +use crate::messages::portfolio::document::node_graph::document_node_definitions::resolve_document_node_type; +use crate::messages::portfolio::document::overlays::utility_types::OverlayContext; +use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier; +use crate::messages::portfolio::document::utility_types::network_interface::{InputConnector, NodeTemplate}; +use crate::messages::tool::common_functionality::graph_modification_utils; +pub use crate::messages::tool::common_functionality::graph_modification_utils::NodeGraphLayer; +use crate::messages::tool::common_functionality::snapping::{SnapCandidatePoint, SnapConstraint, SnapData, SnapTypeConfiguration}; +use crate::messages::tool::tool_messages::shape_tool::ShapeToolData; +use crate::messages::tool::tool_messages::tool_prelude::*; +use glam::DVec2; +use graph_craft::document::NodeInput; +use graph_craft::document::value::TaggedValue; +use std::collections::VecDeque; + +#[derive(Clone, PartialEq, Debug, Default)] +pub enum LineEnd { + #[default] + Start, + End, +} + +#[derive(Clone, Debug, Default)] +pub struct LineToolData { + pub drag_start: DVec2, + pub drag_current: DVec2, + pub angle: f64, + pub weight: f64, + pub selected_layers_with_position: HashMap, + pub editing_layer: Option, + pub dragging_endpoint: Option, +} + +#[derive(Default)] +pub struct Line; + +impl Line { + pub fn create_node(document: &DocumentMessageHandler, drag_start: DVec2) -> NodeTemplate { + let node_type = resolve_document_node_type("Line").expect("Line node can't be found"); + node_type.node_template_input_override([ + None, + Some(NodeInput::value(TaggedValue::DVec2(document.metadata().document_to_viewport.transform_point2(drag_start)), false)), + Some(NodeInput::value(TaggedValue::DVec2(document.metadata().document_to_viewport.transform_point2(drag_start)), false)), + ]) + } + + pub fn update_shape( + document: &DocumentMessageHandler, + ipp: &InputPreprocessorMessageHandler, + layer: LayerNodeIdentifier, + shape_tool_data: &mut ShapeToolData, + modifier: ShapeToolModifierKey, + responses: &mut VecDeque, + ) { + let [center, _, lock_angle, snap_angle] = modifier; + + shape_tool_data.line_data.drag_current = ipp.mouse.position; + + let keyboard = &ipp.keyboard; + let ignore = [layer]; + let snap_data = SnapData::ignore(document, ipp, &ignore); + let mut document_points = generate_line(shape_tool_data, snap_data, keyboard.key(lock_angle), keyboard.key(snap_angle), keyboard.key(center)); + + if shape_tool_data.line_data.dragging_endpoint == Some(LineEnd::Start) { + document_points.swap(0, 1); + } + + let Some(node_id) = graph_modification_utils::get_line_id(layer, &document.network_interface) else { + return; + }; + + responses.add(NodeGraphMessage::SetInput { + input_connector: InputConnector::node(node_id, 1), + input: NodeInput::value(TaggedValue::DVec2(document_points[0]), false), + }); + responses.add(NodeGraphMessage::SetInput { + input_connector: InputConnector::node(node_id, 2), + input: NodeInput::value(TaggedValue::DVec2(document_points[1]), false), + }); + responses.add(NodeGraphMessage::RunDocumentGraph); + } + + pub fn overlays(document: &DocumentMessageHandler, shape_tool_data: &mut ShapeToolData, overlay_context: &mut OverlayContext) { + shape_tool_data.line_data.selected_layers_with_position = document + .network_interface + .selected_nodes() + .selected_visible_and_unlocked_layers(&document.network_interface) + .filter_map(|layer| { + let node_inputs = NodeGraphLayer::new(layer, &document.network_interface).find_node_inputs("Line")?; + + let (Some(&TaggedValue::DVec2(start)), Some(&TaggedValue::DVec2(end))) = (node_inputs[1].as_value(), node_inputs[2].as_value()) else { + return None; + }; + + let [viewport_start, viewport_end] = [start, end].map(|point| document.metadata().transform_to_viewport(layer).transform_point2(point)); + if !start.abs_diff_eq(end, f64::EPSILON * 1000.) { + overlay_context.line(viewport_start, viewport_end, None, None); + overlay_context.square(viewport_start, Some(6.), None, None); + overlay_context.square(viewport_end, Some(6.), None, None); + } + + Some((layer, [start, end])) + }) + .collect::>(); + } +} + +fn generate_line(tool_data: &mut ShapeToolData, snap_data: SnapData, lock_angle: bool, snap_angle: bool, center: bool) -> [DVec2; 2] { + let document_to_viewport = snap_data.document.metadata().document_to_viewport; + let mut document_points = [tool_data.data.drag_start, document_to_viewport.inverse().transform_point2(tool_data.line_data.drag_current)]; + + let mut angle = -(document_points[1] - document_points[0]).angle_to(DVec2::X); + let mut line_length = (document_points[1] - document_points[0]).length(); + + if lock_angle { + angle = tool_data.line_data.angle; + } else if snap_angle { + let snap_resolution = LINE_ROTATE_SNAP_ANGLE.to_radians(); + angle = (angle / snap_resolution).round() * snap_resolution; + } + + tool_data.line_data.angle = angle; + + if lock_angle { + let angle_vec = DVec2::new(angle.cos(), angle.sin()); + line_length = (document_points[1] - document_points[0]).dot(angle_vec); + } + + document_points[1] = document_points[0] + line_length * DVec2::new(angle.cos(), angle.sin()); + + let constrained = snap_angle || lock_angle; + let snap = &mut tool_data.data.snap_manager; + + let near_point = SnapCandidatePoint::handle_neighbors(document_points[1], [tool_data.data.drag_start]); + let far_point = SnapCandidatePoint::handle_neighbors(2. * document_points[0] - document_points[1], [tool_data.data.drag_start]); + let config = SnapTypeConfiguration::default(); + + if constrained { + let constraint = SnapConstraint::Line { + origin: document_points[0], + direction: document_points[1] - document_points[0], + }; + if center { + let snapped = snap.constrained_snap(&snap_data, &near_point, constraint, config); + let snapped_far = snap.constrained_snap(&snap_data, &far_point, constraint, config); + let best = if snapped_far.other_snap_better(&snapped) { snapped } else { snapped_far }; + document_points[1] = document_points[0] * 2. - best.snapped_point_document; + document_points[0] = best.snapped_point_document; + snap.update_indicator(best); + } else { + let snapped = snap.constrained_snap(&snap_data, &near_point, constraint, config); + document_points[1] = snapped.snapped_point_document; + snap.update_indicator(snapped); + } + } else if center { + let snapped = snap.free_snap(&snap_data, &near_point, config); + let snapped_far = snap.free_snap(&snap_data, &far_point, config); + let best = if snapped_far.other_snap_better(&snapped) { snapped } else { snapped_far }; + document_points[1] = document_points[0] * 2. - best.snapped_point_document; + document_points[0] = best.snapped_point_document; + snap.update_indicator(best); + } else { + let snapped = snap.free_snap(&snap_data, &near_point, config); + document_points[1] = snapped.snapped_point_document; + snap.update_indicator(snapped); + } + + document_points +} + +pub fn clicked_on_line_endpoints(layer: LayerNodeIdentifier, document: &DocumentMessageHandler, input: &InputPreprocessorMessageHandler, shape_tool_data: &mut ShapeToolData) -> bool { + let Some(node_inputs) = NodeGraphLayer::new(layer, &document.network_interface).find_node_inputs("Line") else { + return false; + }; + + let (Some(&TaggedValue::DVec2(document_start)), Some(&TaggedValue::DVec2(document_end))) = (node_inputs[1].as_value(), node_inputs[2].as_value()) else { + return false; + }; + + let transform = document.metadata().transform_to_viewport(layer); + let viewport_x = transform.transform_vector2(DVec2::X).normalize_or_zero() * BOUNDS_SELECT_THRESHOLD; + let viewport_y = transform.transform_vector2(DVec2::Y).normalize_or_zero() * BOUNDS_SELECT_THRESHOLD; + let threshold_x = transform.inverse().transform_vector2(viewport_x).length(); + let threshold_y = transform.inverse().transform_vector2(viewport_y).length(); + + let drag_start = input.mouse.position; + let [start, end] = [document_start, document_end].map(|point| transform.transform_point2(point)); + + let start_click = (drag_start.y - start.y).abs() < threshold_y && (drag_start.x - start.x).abs() < threshold_x; + let end_click = (drag_start.y - end.y).abs() < threshold_y && (drag_start.x - end.x).abs() < threshold_x; + + if start_click || end_click { + shape_tool_data.line_data.dragging_endpoint = Some(if end_click { LineEnd::End } else { LineEnd::Start }); + shape_tool_data.data.drag_start = if end_click { document_start } else { document_end }; + shape_tool_data.line_data.editing_layer = Some(layer); + return true; + } + false +} + +#[cfg(test)] +mod test_line_tool { + use crate::messages::portfolio::document::graph_operation::utility_types::TransformIn; + use crate::messages::tool::common_functionality::graph_modification_utils::NodeGraphLayer; + use crate::test_utils::test_prelude::*; + use glam::DAffine2; + use graph_craft::document::value::TaggedValue; + + async fn get_line_node_inputs(editor: &mut EditorTestUtils) -> Option<(DVec2, DVec2)> { + let document = editor.active_document(); + let network_interface = &document.network_interface; + let node_id = network_interface + .selected_nodes() + .selected_visible_and_unlocked_layers(network_interface) + .filter_map(|layer| { + let node_inputs = NodeGraphLayer::new(layer, &network_interface).find_node_inputs("Line")?; + let (Some(&TaggedValue::DVec2(start)), Some(&TaggedValue::DVec2(end))) = (node_inputs[1].as_value(), node_inputs[2].as_value()) else { + return None; + }; + Some((start, end)) + }) + .next(); + node_id + } + + #[tokio::test] + async fn test_line_tool_basicdraw() { + let mut editor = EditorTestUtils::create(); + editor.new_document().await; + editor.drag_tool(ToolType::Line, 0., 0., 100., 100., ModifierKeys::empty()).await; + if let Some((start_input, end_input)) = get_line_node_inputs(&mut editor).await { + match (start_input, end_input) { + (start_input, end_input) => { + assert!((start_input - DVec2::ZERO).length() < 1., "Start point should be near (0,0)"); + assert!((end_input - DVec2::new(100., 100.)).length() < 1., "End point should be near (100,100)"); + } + } + } + } + + #[tokio::test] + async fn test_line_tool_with_transformed_viewport() { + let mut editor = EditorTestUtils::create(); + editor.new_document().await; + editor.handle_message(NavigationMessage::CanvasZoomSet { zoom_factor: 2. }).await; + editor.handle_message(NavigationMessage::CanvasPan { delta: DVec2::new(100., 50.) }).await; + editor + .handle_message(NavigationMessage::CanvasTiltSet { + angle_radians: (30. as f64).to_radians(), + }) + .await; + editor.drag_tool(ToolType::Line, 0., 0., 100., 100., ModifierKeys::empty()).await; + if let Some((start_input, end_input)) = get_line_node_inputs(&mut editor).await { + let document = editor.active_document(); + let document_to_viewport = document.metadata().document_to_viewport; + let viewport_to_document = document_to_viewport.inverse(); + + let expected_start = viewport_to_document.transform_point2(DVec2::ZERO); + let expected_end = viewport_to_document.transform_point2(DVec2::new(100., 100.)); + + assert!( + (start_input - expected_start).length() < 1., + "Start point should match expected document coordinates. Got {:?}, expected {:?}", + start_input, + expected_start + ); + assert!( + (end_input - expected_end).length() < 1., + "End point should match expected document coordinates. Got {:?}, expected {:?}", + end_input, + expected_end + ); + } else { + panic!("Line was not created successfully with transformed viewport"); + } + } + + #[tokio::test] + async fn test_line_tool_ctrl_anglelock() { + let mut editor = EditorTestUtils::create(); + editor.new_document().await; + editor.drag_tool(ToolType::Line, 0., 0., 100., 100., ModifierKeys::CONTROL).await; + if let Some((start_input, end_input)) = get_line_node_inputs(&mut editor).await { + match (start_input, end_input) { + (start_input, end_input) => { + let line_vec = end_input - start_input; + let original_angle = line_vec.angle_to(DVec2::X); + editor.drag_tool(ToolType::Line, 0., 0., 200., 50., ModifierKeys::CONTROL).await; + if let Some((updated_start, updated_end)) = get_line_node_inputs(&mut editor).await { + match (updated_start, updated_end) { + (updated_start, updated_end) => { + let updated_line_vec = updated_end - updated_start; + let updated_angle = updated_line_vec.angle_to(DVec2::X); + print!("{:?}", original_angle); + print!("{:?}", updated_angle); + assert!( + line_vec.normalize().dot(updated_line_vec.normalize()).abs() - 1. < 1e-6, + "Line angle should be locked when Ctrl is kept pressed" + ); + assert!((updated_start - updated_end).length() > 1., "Line should be able to change length when Ctrl is kept pressed"); + } + } + } + } + } + } + } + + #[tokio::test] + async fn test_line_tool_alt() { + let mut editor = EditorTestUtils::create(); + editor.new_document().await; + editor.drag_tool(ToolType::Line, 100., 100., 200., 100., ModifierKeys::ALT).await; + if let Some((start_input, end_input)) = get_line_node_inputs(&mut editor).await { + match (start_input, end_input) { + (start_input, end_input) => { + let expected_start = DVec2::new(0., 100.); + let expected_end = DVec2::new(200., 100.); + assert!((start_input - expected_start).length() < 1., "Start point should be near (0, 100)"); + assert!((end_input - expected_end).length() < 1., "End point should be near (200, 100)"); + } + } + } + } + + #[tokio::test] + async fn test_line_tool_alt_shift_drag() { + let mut editor = EditorTestUtils::create(); + editor.new_document().await; + editor.drag_tool(ToolType::Line, 100., 100., 150., 120., ModifierKeys::ALT | ModifierKeys::SHIFT).await; + if let Some((start_input, end_input)) = get_line_node_inputs(&mut editor).await { + match (start_input, end_input) { + (start_input, end_input) => { + let line_vec = end_input - start_input; + let angle_radians = line_vec.angle_to(DVec2::X); + let angle_degrees = angle_radians.to_degrees(); + let nearest_angle = (angle_degrees / 15.).round() * 15.; + + assert!((angle_degrees - nearest_angle).abs() < 1., "Angle should snap to the nearest 15 degrees"); + } + } + } + } + + #[tokio::test] + async fn test_line_tool_with_transformed_artboard() { + let mut editor = EditorTestUtils::create(); + editor.new_document().await; + editor.drag_tool(ToolType::Artboard, 0., 0., 200., 200., ModifierKeys::empty()).await; + + let artboard_id = editor.get_selected_layer().await.expect("Should have selected the artboard"); + + editor + .handle_message(GraphOperationMessage::TransformChange { + layer: artboard_id, + transform: DAffine2::from_angle(45_f64.to_radians()), + transform_in: TransformIn::Local, + skip_rerender: false, + }) + .await; + + editor.drag_tool(ToolType::Line, 50., 50., 150., 150., ModifierKeys::empty()).await; + + let (start_input, end_input) = get_line_node_inputs(&mut editor).await.expect("Line was not created successfully within transformed artboard"); + // The line should still be diagonal with equal change in x and y + let line_vector = end_input - start_input; + // Verifying the line is approximately 100*sqrt(2) units in length (diagonal of 100x100 square) + let line_length = line_vector.length(); + assert!( + (line_length - 141.42).abs() < 1., // 100 * sqrt(2) ~= 141.42 + "Line length should be approximately 141.42 units. Got: {line_length}" + ); + assert!((line_vector.x - 100.).abs() < 1., "X-component of line vector should be approximately 100. Got: {}", line_vector.x); + assert!( + (line_vector.y.abs() - 100.).abs() < 1., + "Absolute Y-component of line vector should be approximately 100. Got: {}", + line_vector.y.abs() + ); + let angle_degrees = line_vector.angle_to(DVec2::X).to_degrees(); + assert!((angle_degrees - (-45.)).abs() < 1., "Line angle should be close to -45 degrees. Got: {angle_degrees}"); + } +} diff --git a/editor/src/messages/tool/common_functionality/shapes/mod.rs b/editor/src/messages/tool/common_functionality/shapes/mod.rs new file mode 100644 index 0000000000..44f40b5982 --- /dev/null +++ b/editor/src/messages/tool/common_functionality/shapes/mod.rs @@ -0,0 +1,11 @@ +pub mod ellipse_shape; +pub mod line_shape; +pub mod polygon_shape; +pub mod rectangle_shape; +pub mod shape_utility; +pub mod star_shape; + +pub use super::shapes::ellipse_shape::Ellipse; +pub use super::shapes::line_shape::{Line, LineEnd}; +pub use super::shapes::rectangle_shape::Rectangle; +pub use crate::messages::tool::tool_messages::shape_tool::ShapeToolData; diff --git a/editor/src/messages/tool/common_functionality/shapes/polygon_shape.rs b/editor/src/messages/tool/common_functionality/shapes/polygon_shape.rs new file mode 100644 index 0000000000..871cf2c0b2 --- /dev/null +++ b/editor/src/messages/tool/common_functionality/shapes/polygon_shape.rs @@ -0,0 +1,68 @@ +use super::shape_utility::ShapeToolModifierKey; +use super::shape_utility::update_radius_sign; +use super::*; +use crate::messages::portfolio::document::graph_operation::utility_types::TransformIn; +use crate::messages::portfolio::document::node_graph::document_node_definitions::resolve_document_node_type; +use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier; +use crate::messages::portfolio::document::utility_types::network_interface::{InputConnector, NodeTemplate}; +use crate::messages::tool::common_functionality::graph_modification_utils; +use crate::messages::tool::tool_messages::tool_prelude::*; +use glam::DAffine2; +use graph_craft::document::NodeInput; +use graph_craft::document::value::TaggedValue; +use std::collections::VecDeque; + +#[derive(Default)] +pub struct Polygon; + +impl Polygon { + pub fn create_node(vertices: u32) -> NodeTemplate { + let node_type = resolve_document_node_type("Regular Polygon").expect("Regular Polygon can't be found"); + node_type.node_template_input_override([None, Some(NodeInput::value(TaggedValue::U32(vertices), false)), Some(NodeInput::value(TaggedValue::F64(0.5), false))]) + } + + pub fn update_shape( + document: &DocumentMessageHandler, + ipp: &InputPreprocessorMessageHandler, + layer: LayerNodeIdentifier, + shape_tool_data: &mut ShapeToolData, + modifier: ShapeToolModifierKey, + responses: &mut VecDeque, + ) { + let [center, lock_ratio, _, _] = modifier; + + if let Some([start, end]) = shape_tool_data.data.calculate_points(document, ipp, center, lock_ratio) { + // TODO: We need to determine how to allow the polygon node to make irregular shapes + update_radius_sign(end, start, layer, document, responses); + + let dimensions = (start - end).abs(); + + // We keep the smaller dimension's scale at 1 and scale the other dimension accordingly + let mut scale = DVec2::ONE; + let radius; + if dimensions.x > dimensions.y { + scale.x = dimensions.x / dimensions.y; + radius = dimensions.y / 2.; + } else { + scale.y = dimensions.y / dimensions.x; + radius = dimensions.x / 2.; + } + + let Some(node_id) = graph_modification_utils::get_polygon_id(layer, &document.network_interface) else { + return; + }; + + responses.add(NodeGraphMessage::SetInput { + input_connector: InputConnector::node(node_id, 2), + input: NodeInput::value(TaggedValue::F64(radius), false), + }); + + responses.add(GraphOperationMessage::TransformSet { + layer, + transform: DAffine2::from_scale_angle_translation(scale, 0., (start + end) / 2.), + transform_in: TransformIn::Viewport, + skip_rerender: false, + }); + } + } +} diff --git a/editor/src/messages/tool/common_functionality/shapes/rectangle_shape.rs b/editor/src/messages/tool/common_functionality/shapes/rectangle_shape.rs new file mode 100644 index 0000000000..cbd6722960 --- /dev/null +++ b/editor/src/messages/tool/common_functionality/shapes/rectangle_shape.rs @@ -0,0 +1,54 @@ +use super::shape_utility::ShapeToolModifierKey; +use super::*; +use crate::messages::portfolio::document::graph_operation::utility_types::TransformIn; +use crate::messages::portfolio::document::node_graph::document_node_definitions::resolve_document_node_type; +use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier; +use crate::messages::portfolio::document::utility_types::network_interface::{InputConnector, NodeTemplate}; +use crate::messages::tool::common_functionality::graph_modification_utils; +use crate::messages::tool::tool_messages::tool_prelude::*; +use glam::DAffine2; +use graph_craft::document::NodeInput; +use graph_craft::document::value::TaggedValue; +use std::collections::VecDeque; + +#[derive(Default)] +pub struct Rectangle; + +impl Rectangle { + pub fn create_node() -> NodeTemplate { + let node_type = resolve_document_node_type("Rectangle").expect("Rectangle node can't be found"); + node_type.node_template_input_override([None, Some(NodeInput::value(TaggedValue::F64(1.), false)), Some(NodeInput::value(TaggedValue::F64(1.), false))]) + } + + pub fn update_shape( + document: &DocumentMessageHandler, + ipp: &InputPreprocessorMessageHandler, + layer: LayerNodeIdentifier, + shape_tool_data: &mut ShapeToolData, + modifier: ShapeToolModifierKey, + responses: &mut VecDeque, + ) { + let [center, lock_ratio, _, _] = modifier; + + if let Some([start, end]) = shape_tool_data.data.calculate_points(document, ipp, center, lock_ratio) { + let Some(node_id) = graph_modification_utils::get_rectangle_id(layer, &document.network_interface) else { + return; + }; + + responses.add(NodeGraphMessage::SetInput { + input_connector: InputConnector::node(node_id, 1), + input: NodeInput::value(TaggedValue::F64((start.x - end.x).abs()), false), + }); + responses.add(NodeGraphMessage::SetInput { + input_connector: InputConnector::node(node_id, 2), + input: NodeInput::value(TaggedValue::F64((start.y - end.y).abs()), false), + }); + responses.add(GraphOperationMessage::TransformSet { + layer, + transform: DAffine2::from_translation(start.midpoint(end)), + transform_in: TransformIn::Viewport, + skip_rerender: false, + }); + } + } +} diff --git a/editor/src/messages/tool/common_functionality/shapes/shape_utility.rs b/editor/src/messages/tool/common_functionality/shapes/shape_utility.rs new file mode 100644 index 0000000000..772991be4b --- /dev/null +++ b/editor/src/messages/tool/common_functionality/shapes/shape_utility.rs @@ -0,0 +1,320 @@ +use super::ShapeToolData; +use crate::messages::message::Message; +use crate::messages::portfolio::document::overlays::utility_types::OverlayContext; +use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier; +use crate::messages::portfolio::document::utility_types::network_interface::InputConnector; +use crate::messages::prelude::{DocumentMessageHandler, NodeGraphMessage, Responses}; +use crate::messages::tool::common_functionality::graph_modification_utils::NodeGraphLayer; +use crate::messages::tool::common_functionality::transformation_cage::BoundingBoxManager; +use crate::messages::tool::tool_messages::tool_prelude::Key; +use crate::messages::tool::utility_types::*; +use bezier_rs::Subpath; +use glam::{DAffine2, DMat2, DVec2}; +use graph_craft::document::NodeInput; +use graph_craft::document::value::TaggedValue; +use graphene_std::renderer::ClickTargetType; +use graphene_std::vector::misc::dvec2_to_point; +use kurbo::{BezPath, PathEl, Shape}; +use std::collections::VecDeque; +use std::f64::consts::{PI, TAU}; + +#[derive(Debug, Clone, Copy, Eq, PartialEq, Default, serde::Serialize, serde::Deserialize, specta::Type)] +pub enum ShapeType { + #[default] + Polygon = 0, + Star = 1, + Rectangle = 2, + Ellipse = 3, + Line = 4, +} + +impl ShapeType { + pub fn name(&self) -> String { + (match self { + Self::Polygon => "Polygon", + Self::Star => "Star", + Self::Rectangle => "Rectangle", + Self::Ellipse => "Ellipse", + Self::Line => "Line", + }) + .into() + } + + pub fn tooltip(&self) -> String { + (match self { + Self::Line => "Line Tool", + Self::Rectangle => "Rectangle Tool", + Self::Ellipse => "Ellipse Tool", + _ => "", + }) + .into() + } + + pub fn icon_name(&self) -> String { + (match self { + Self::Line => "VectorLineTool", + Self::Rectangle => "VectorRectangleTool", + Self::Ellipse => "VectorEllipseTool", + _ => "", + }) + .into() + } + + pub fn tool_type(&self) -> ToolType { + match self { + Self::Line => ToolType::Line, + Self::Rectangle => ToolType::Rectangle, + Self::Ellipse => ToolType::Ellipse, + _ => ToolType::Shape, + } + } +} + +/// Center, Lock Ratio, Lock Angle, Snap Angle, Increase/Decrease Side +pub type ShapeToolModifierKey = [Key; 4]; + +pub fn update_radius_sign(end: DVec2, start: DVec2, layer: LayerNodeIdentifier, document: &DocumentMessageHandler, responses: &mut VecDeque) { + let sign_num = if end[1] > start[1] { 1. } else { -1. }; + let new_layer = NodeGraphLayer::new(layer, &document.network_interface); + + if new_layer.find_input("Regular Polygon", 1).unwrap_or(&TaggedValue::U32(0)).to_u32() % 2 == 1 { + let Some(polygon_node_id) = new_layer.upstream_node_id_from_name("Regular Polygon") else { return }; + + responses.add(NodeGraphMessage::SetInput { + input_connector: InputConnector::node(polygon_node_id, 2), + input: NodeInput::value(TaggedValue::F64(sign_num * 0.5), false), + }); + return; + } + + if new_layer.find_input("Star", 1).unwrap_or(&TaggedValue::U32(0)).to_u32() % 2 == 1 { + let Some(star_node_id) = new_layer.upstream_node_id_from_name("Star") else { return }; + + responses.add(NodeGraphMessage::SetInput { + input_connector: InputConnector::node(star_node_id, 2), + input: NodeInput::value(TaggedValue::F64(sign_num * 0.5), false), + }); + responses.add(NodeGraphMessage::SetInput { + input_connector: InputConnector::node(star_node_id, 3), + input: NodeInput::value(TaggedValue::F64(sign_num * 0.25), false), + }); + } +} + +pub fn transform_cage_overlays(document: &DocumentMessageHandler, tool_data: &mut ShapeToolData, overlay_context: &mut OverlayContext) { + let mut transform = document + .network_interface + .selected_nodes() + .selected_visible_and_unlocked_layers(&document.network_interface) + .find(|layer| !document.network_interface.is_artboard(&layer.to_node(), &[])) + .map(|layer| document.metadata().transform_to_viewport_with_first_transform_node_if_group(layer, &document.network_interface)) + .unwrap_or_default(); + + // Check if the matrix is not invertible + let mut transform_tampered = false; + if transform.matrix2.determinant() == 0. { + transform.matrix2 += DMat2::IDENTITY * 1e-4; // TODO: Is this the cleanest way to handle this? + transform_tampered = true; + } + + let bounds = document + .network_interface + .selected_nodes() + .selected_visible_and_unlocked_layers(&document.network_interface) + .filter(|layer| !document.network_interface.is_artboard(&layer.to_node(), &[])) + .filter_map(|layer| { + document + .metadata() + .bounding_box_with_transform(layer, transform.inverse() * document.metadata().transform_to_viewport(layer)) + }) + .reduce(graphene_std::renderer::Quad::combine_bounds); + + if let Some(bounds) = bounds { + let bounding_box_manager = tool_data.bounding_box_manager.get_or_insert(BoundingBoxManager::default()); + + bounding_box_manager.bounds = bounds; + bounding_box_manager.transform = transform; + bounding_box_manager.transform_tampered = transform_tampered; + bounding_box_manager.render_overlays(overlay_context, true); + } else { + tool_data.bounding_box_manager.take(); + } +} + +pub fn anchor_overlays(document: &DocumentMessageHandler, overlay_context: &mut OverlayContext) { + for layer in document.network_interface.selected_nodes().selected_layers(document.metadata()) { + let Some(vector_data) = document.network_interface.compute_modified_vector(layer) else { continue }; + let transform = document.metadata().transform_to_viewport(layer); + + overlay_context.outline_vector(&vector_data, transform); + + for (_, &position) in vector_data.point_domain.ids().iter().zip(vector_data.point_domain.positions()) { + overlay_context.manipulator_anchor(transform.transform_point2(position), false, None); + } + } +} + +/// Extract the node input values of Star +pub fn extract_star_parameters(layer: Option, document: &DocumentMessageHandler) -> Option<(u32, f64, f64)> { + let node_inputs = NodeGraphLayer::new(layer?, &document.network_interface).find_node_inputs("Star")?; + + let (Some(&TaggedValue::U32(n)), Some(&TaggedValue::F64(outer)), Some(&TaggedValue::F64(inner))) = (node_inputs.get(1)?.as_value(), node_inputs.get(2)?.as_value(), node_inputs.get(3)?.as_value()) + else { + return None; + }; + + Some((n, outer, inner)) +} + +/// Extract the node input values of Polygon +pub fn extract_polygon_parameters(layer: Option, document: &DocumentMessageHandler) -> Option<(u32, f64)> { + let node_inputs = NodeGraphLayer::new(layer?, &document.network_interface).find_node_inputs("Regular Polygon")?; + + let (Some(&TaggedValue::U32(n)), Some(&TaggedValue::F64(radius))) = (node_inputs.get(1)?.as_value(), node_inputs.get(2)?.as_value()) else { + return None; + }; + + Some((n, radius)) +} + +/// Calculate the viewport position of as a star vertex given its index +pub fn star_vertex_position(viewport: DAffine2, vertex_index: i32, n: u32, radius1: f64, radius2: f64) -> DVec2 { + let angle = ((vertex_index as f64) * PI) / (n as f64); + let radius = if vertex_index % 2 == 0 { radius1 } else { radius2 }; + + viewport.transform_point2(DVec2 { + x: radius * angle.sin(), + y: -radius * angle.cos(), + }) +} + +/// Calculate the viewport position of as a polygon vertex given its index +pub fn polygon_vertex_position(viewport: DAffine2, vertex_index: i32, n: u32, radius: f64) -> DVec2 { + let angle = ((vertex_index as f64) * TAU) / (n as f64); + + viewport.transform_point2(DVec2 { + x: radius * angle.sin(), + y: -radius * angle.cos(), + }) +} + +/// Outlines the geometric shape made by the Star node +pub fn star_outline(layer: LayerNodeIdentifier, document: &DocumentMessageHandler, overlay_context: &mut OverlayContext) { + let mut anchors = Vec::new(); + let Some((n, radius1, radius2)) = extract_star_parameters(Some(layer), document) else { return }; + + let viewport = document.metadata().transform_to_viewport(layer); + for i in 0..2 * n { + let angle = ((i as f64) * PI) / (n as f64); + let radius = if i % 2 == 0 { radius1 } else { radius2 }; + + let point = DVec2 { + x: radius * angle.sin(), + y: -radius * angle.cos(), + }; + + anchors.push(point); + } + + let subpath = [ClickTargetType::Subpath(Subpath::from_anchors_linear(anchors, true))]; + overlay_context.outline(subpath.iter(), viewport, None); +} + +/// Outlines the geometric shape made by the Polygon node +pub fn polygon_outline(layer: LayerNodeIdentifier, document: &DocumentMessageHandler, overlay_context: &mut OverlayContext) { + let mut anchors = Vec::new(); + + let Some((n, radius)) = extract_polygon_parameters(Some(layer), document) else { + return; + }; + + let viewport = document.metadata().transform_to_viewport(layer); + for i in 0..2 * n { + let angle = ((i as f64) * TAU) / (n as f64); + + let point = DVec2 { + x: radius * angle.sin(), + y: -radius * angle.cos(), + }; + + anchors.push(point); + } + + let subpath: Vec = vec![ClickTargetType::Subpath(Subpath::from_anchors_linear(anchors, true))]; + + overlay_context.outline(subpath.iter(), viewport, None); +} + +/// Check if the the cursor is inside the geometric star shape made by the Star node without any upstream node modifications +pub fn inside_star(viewport: DAffine2, n: u32, radius1: f64, radius2: f64, mouse_position: DVec2) -> bool { + let mut paths = Vec::new(); + + for i in 0..2 * n { + let new_point = dvec2_to_point(star_vertex_position(viewport, i as i32, n, radius1, radius2)); + + if i == 0 { + paths.push(PathEl::MoveTo(new_point)); + } else { + paths.push(PathEl::LineTo(new_point)); + } + } + + paths.push(PathEl::ClosePath); + + let bez_path = BezPath::from_vec(paths); + let (shape, bbox) = (bez_path.clone(), bez_path.bounding_box()); + + if bbox.x0 > mouse_position.x || bbox.y0 > mouse_position.y || bbox.x1 < mouse_position.x || bbox.y1 < mouse_position.y { + return false; + } + + let winding = shape.winding(dvec2_to_point(mouse_position)); + + // Non-zero fill rule + winding != 0 +} + +/// Check if the the cursor is inside the geometric polygon shape made by the Polygon node without any upstream node modifications +pub fn inside_polygon(viewport: DAffine2, n: u32, radius: f64, mouse_position: DVec2) -> bool { + let mut paths = Vec::new(); + + for i in 0..n { + let new_point = dvec2_to_point(polygon_vertex_position(viewport, i as i32, n, radius)); + + if i == 0 { + paths.push(PathEl::MoveTo(new_point)); + } else { + paths.push(PathEl::LineTo(new_point)); + } + } + + paths.push(PathEl::ClosePath); + + let bez_path = BezPath::from_vec(paths); + let (shape, bbox) = (bez_path.clone(), bez_path.bounding_box()); + + if bbox.x0 > mouse_position.x || bbox.y0 > mouse_position.y || bbox.x1 < mouse_position.x || bbox.y1 < mouse_position.y { + return false; + } + + let winding = shape.winding(dvec2_to_point(mouse_position)); + + // Non-zero fill rule + winding != 0 +} + +pub fn draw_snapping_ticks(snap_radii: &[f64], direction: DVec2, viewport: DAffine2, angle: f64, overlay_context: &mut OverlayContext) { + for &snapped_radius in snap_radii { + let Some(tick_direction) = direction.perp().try_normalize() else { + return; + }; + + let tick_position = viewport.transform_point2(DVec2 { + x: snapped_radius * angle.sin(), + y: -snapped_radius * angle.cos(), + }); + + overlay_context.line(tick_position, tick_position + tick_direction * 5., None, Some(2.)); + overlay_context.line(tick_position, tick_position - tick_direction * 5., None, Some(2.)); + } +} diff --git a/editor/src/messages/tool/common_functionality/shapes/star_shape.rs b/editor/src/messages/tool/common_functionality/shapes/star_shape.rs new file mode 100644 index 0000000000..21069620d8 --- /dev/null +++ b/editor/src/messages/tool/common_functionality/shapes/star_shape.rs @@ -0,0 +1,78 @@ +use super::shape_utility::{ShapeToolModifierKey, update_radius_sign}; +use super::*; +use crate::messages::portfolio::document::graph_operation::utility_types::TransformIn; +use crate::messages::portfolio::document::node_graph::document_node_definitions::resolve_document_node_type; +use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier; +use crate::messages::portfolio::document::utility_types::network_interface::{InputConnector, NodeTemplate}; +use crate::messages::tool::common_functionality::graph_modification_utils; +use crate::messages::tool::tool_messages::tool_prelude::*; +use core::f64; +use glam::DAffine2; +use graph_craft::document::NodeInput; +use graph_craft::document::value::TaggedValue; +use std::collections::VecDeque; + +#[derive(Default)] +pub struct Star; + +impl Star { + pub fn create_node(vertices: u32) -> NodeTemplate { + let node_type = resolve_document_node_type("Star").expect("Star node can't be found"); + node_type.node_template_input_override([ + None, + Some(NodeInput::value(TaggedValue::U32(vertices), false)), + Some(NodeInput::value(TaggedValue::F64(0.5), false)), + Some(NodeInput::value(TaggedValue::F64(0.25), false)), + ]) + } + + pub fn update_shape( + document: &DocumentMessageHandler, + ipp: &InputPreprocessorMessageHandler, + layer: LayerNodeIdentifier, + shape_tool_data: &mut ShapeToolData, + modifier: ShapeToolModifierKey, + responses: &mut VecDeque, + ) { + let [center, lock_ratio, _, _] = modifier; + + if let Some([start, end]) = shape_tool_data.data.calculate_points(document, ipp, center, lock_ratio) { + // TODO: We need to determine how to allow the polygon node to make irregular shapes + update_radius_sign(end, start, layer, document, responses); + + let dimensions = (start - end).abs(); + + // We keep the smaller dimension's scale at 1 and scale the other dimension accordingly + let mut scale = DVec2::ONE; + let radius: f64; + if dimensions.x > dimensions.y { + scale.x = dimensions.x / dimensions.y; + radius = dimensions.y / 2.; + } else { + scale.y = dimensions.y / dimensions.x; + radius = dimensions.x / 2.; + } + + let Some(node_id) = graph_modification_utils::get_star_id(layer, &document.network_interface) else { + return; + }; + + responses.add(NodeGraphMessage::SetInput { + input_connector: InputConnector::node(node_id, 2), + input: NodeInput::value(TaggedValue::F64(radius), false), + }); + + responses.add(NodeGraphMessage::SetInput { + input_connector: InputConnector::node(node_id, 3), + input: NodeInput::value(TaggedValue::F64(radius / 2.), false), + }); + + responses.add(GraphOperationMessage::TransformSet { + layer, + transform: DAffine2::from_scale_angle_translation(scale, 0., (start + end) / 2.), + transform_in: TransformIn::Viewport, + skip_rerender: false, + }); + } + } +} diff --git a/editor/src/messages/tool/common_functionality/snapping.rs b/editor/src/messages/tool/common_functionality/snapping.rs index 7e334fefc5..63319b32a0 100644 --- a/editor/src/messages/tool/common_functionality/snapping.rs +++ b/editor/src/messages/tool/common_functionality/snapping.rs @@ -250,6 +250,10 @@ impl SnapManager { self.update_indicator(snapped); } + pub fn indicator_pos(&self) -> Option { + self.indicator.as_ref().map(|point| point.snapped_point_document) + } + fn find_best_snap(snap_data: &mut SnapData, point: &SnapCandidatePoint, snap_results: SnapResults, constrained: bool, off_screen: bool, to_path: bool) -> SnappedPoint { let mut snapped_points = Vec::new(); let document = snap_data.document; diff --git a/editor/src/messages/tool/common_functionality/snapping/alignment_snapper.rs b/editor/src/messages/tool/common_functionality/snapping/alignment_snapper.rs index 486d2532d9..4d5645e539 100644 --- a/editor/src/messages/tool/common_functionality/snapping/alignment_snapper.rs +++ b/editor/src/messages/tool/common_functionality/snapping/alignment_snapper.rs @@ -70,7 +70,7 @@ impl AlignmentSnapper { if let Some(quad) = target_point.quad.map(|q| q.0) { if quad[0] == quad[3] && quad[1] == quad[2] && quad[0] == target_point.document_point { let [p1, p2, ..] = quad; - let direction = (p2 - p1).normalize(); + let Some(direction) = (p2 - p1).try_normalize() else { return }; let normal = DVec2::new(-direction.y, direction.x); for endpoint in [p1, p2] { diff --git a/editor/src/messages/tool/common_functionality/utility_functions.rs b/editor/src/messages/tool/common_functionality/utility_functions.rs index 9d8554d780..c6974d5009 100644 --- a/editor/src/messages/tool/common_functionality/utility_functions.rs +++ b/editor/src/messages/tool/common_functionality/utility_functions.rs @@ -1,9 +1,15 @@ +use super::snapping::{SnapCandidatePoint, SnapData, SnapManager}; +use super::transformation_cage::{BoundingBoxManager, SizeSnapData}; +use crate::consts::ROTATE_INCREMENT; use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier; +use crate::messages::portfolio::document::utility_types::transformation::Selected; use crate::messages::prelude::*; use crate::messages::tool::common_functionality::graph_modification_utils::get_text; +use crate::messages::tool::common_functionality::transformation_cage::SelectedEdges; use crate::messages::tool::tool_messages::path_tool::PathOverlayMode; +use crate::messages::tool::utility_types::ToolType; use bezier_rs::Bezier; -use glam::DVec2; +use glam::{DAffine2, DVec2}; use graphene_std::renderer::Quad; use graphene_std::text::{FontCache, load_face}; use graphene_std::vector::{HandleId, ManipulatorPointId, PointId, SegmentId, VectorData, VectorModificationType}; @@ -198,6 +204,228 @@ pub fn is_visible_point( } } +pub fn resize_bounds( + document: &DocumentMessageHandler, + responses: &mut VecDeque, + bounds: &mut BoundingBoxManager, + dragging_layers: &mut Vec, + snap_manager: &mut SnapManager, + snap_candidates: &mut Vec, + input: &InputPreprocessorMessageHandler, + center: bool, + constrain: bool, + tool: ToolType, +) { + if let Some(movement) = &mut bounds.selected_edges { + let center = center.then_some(bounds.center_of_transformation); + let snap = Some(SizeSnapData { + manager: snap_manager, + points: snap_candidates, + snap_data: SnapData::ignore(document, input, &dragging_layers), + }); + let (position, size) = movement.new_size(input.mouse.position, bounds.original_bound_transform, center, constrain, snap); + let (delta, mut pivot) = movement.bounds_to_scale_transform(position, size); + + let pivot_transform = DAffine2::from_translation(pivot); + let transformation = pivot_transform * delta * pivot_transform.inverse(); + + dragging_layers.retain(|layer| { + if *layer != LayerNodeIdentifier::ROOT_PARENT { + document.network_interface.document_network().nodes.contains_key(&layer.to_node()) + } else { + log::error!("ROOT_PARENT should not be part of layers_dragging"); + false + } + }); + + let mut selected = Selected::new(&mut bounds.original_transforms, &mut pivot, &dragging_layers, responses, &document.network_interface, None, &tool, None); + selected.apply_transformation(bounds.original_bound_transform * transformation * bounds.original_bound_transform.inverse(), None); + } +} + +pub fn rotate_bounds( + document: &DocumentMessageHandler, + responses: &mut VecDeque, + bounds: &mut BoundingBoxManager, + dragging_layers: &mut Vec, + drag_start: DVec2, + mouse_position: DVec2, + snap_angle: bool, + tool: ToolType, +) { + let angle = { + let start_offset = drag_start - bounds.center_of_transformation; + let end_offset = mouse_position - bounds.center_of_transformation; + start_offset.angle_to(end_offset) + }; + + let snapped_angle = if snap_angle { + let snap_resolution = ROTATE_INCREMENT.to_radians(); + (angle / snap_resolution).round() * snap_resolution + } else { + angle + }; + + let delta = DAffine2::from_angle(snapped_angle); + + dragging_layers.retain(|layer| { + if *layer != LayerNodeIdentifier::ROOT_PARENT { + document.network_interface.document_network().nodes.contains_key(&layer.to_node()) + } else { + log::error!("ROOT_PARENT should not be part of replacement_selected_layers"); + false + } + }); + + let mut selected = Selected::new( + &mut bounds.original_transforms, + &mut bounds.center_of_transformation, + &dragging_layers, + responses, + &document.network_interface, + None, + &tool, + None, + ); + selected.update_transforms(delta, None, None); +} + +pub fn skew_bounds( + document: &DocumentMessageHandler, + responses: &mut VecDeque, + bounds: &mut BoundingBoxManager, + free_movement: bool, + layers: &mut Vec, + mouse_position: DVec2, + tool: ToolType, +) { + if let Some(movement) = &mut bounds.selected_edges { + let mut pivot = DVec2::ZERO; + + let transformation = movement.skew_transform(mouse_position, bounds.original_bound_transform, free_movement); + + layers.retain(|layer| { + if *layer != LayerNodeIdentifier::ROOT_PARENT { + document.network_interface.document_network().nodes.contains_key(&layer.to_node()) + } else { + log::error!("ROOT_PARENT should not be part of layers_dragging"); + false + } + }); + + let mut selected = Selected::new(&mut bounds.original_transforms, &mut pivot, &layers, responses, &document.network_interface, None, &tool, None); + selected.apply_transformation(bounds.original_bound_transform * transformation * bounds.original_bound_transform.inverse(), None); + } +} + +// TODO: Replace returned tuple (where at most 1 element is true at a time) with an enum. +/// Returns the tuple (resize, rotate, skew). +pub fn transforming_transform_cage( + document: &DocumentMessageHandler, + mut bounding_box_manager: &mut Option, + input: &InputPreprocessorMessageHandler, + responses: &mut VecDeque, + layers_dragging: &mut Vec, +) -> (bool, bool, bool) { + let dragging_bounds = bounding_box_manager.as_mut().and_then(|bounding_box| { + let edges = bounding_box.check_selected_edges(input.mouse.position); + + bounding_box.selected_edges = edges.map(|(top, bottom, left, right)| { + let selected_edges = SelectedEdges::new(top, bottom, left, right, bounding_box.bounds); + bounding_box.opposite_pivot = selected_edges.calculate_pivot(); + selected_edges + }); + + edges + }); + + let rotating_bounds = bounding_box_manager.as_ref().map(|bounding_box| bounding_box.check_rotate(input.mouse.position)).unwrap_or_default(); + + let selected: Vec<_> = document.network_interface.selected_nodes().selected_visible_and_unlocked_layers(&document.network_interface).collect(); + + let is_flat_layer = bounding_box_manager.as_ref().map(|bounding_box_manager| bounding_box_manager.transform_tampered).unwrap_or(true); + + if dragging_bounds.is_some() && !is_flat_layer { + responses.add(DocumentMessage::StartTransaction); + + *layers_dragging = selected; + + if let Some(bounds) = &mut bounding_box_manager { + bounds.original_bound_transform = bounds.transform; + + layers_dragging.retain(|layer| { + if *layer != LayerNodeIdentifier::ROOT_PARENT { + document.network_interface.document_network().nodes.contains_key(&layer.to_node()) + } else { + log::error!("ROOT_PARENT should not be part of layers_dragging"); + false + } + }); + + let mut selected = Selected::new( + &mut bounds.original_transforms, + &mut bounds.center_of_transformation, + &layers_dragging, + responses, + &document.network_interface, + None, + &ToolType::Select, + None, + ); + bounds.center_of_transformation = selected.mean_average_of_pivots(); + + // Check if we're hovering over a skew triangle + let edges = bounds.check_selected_edges(input.mouse.position); + if let Some(edges) = edges { + let closest_edge = bounds.get_closest_edge(edges, input.mouse.position); + if bounds.check_skew_handle(input.mouse.position, closest_edge) { + // No resize or rotate, just skew + return (false, false, true); + } + } + } + + // Just resize, no rotate or skew + return (true, false, false); + } + + if rotating_bounds { + responses.add(DocumentMessage::StartTransaction); + + if let Some(bounds) = &mut bounding_box_manager { + layers_dragging.retain(|layer| { + if *layer != LayerNodeIdentifier::ROOT_PARENT { + document.network_interface.document_network().nodes.contains_key(&layer.to_node()) + } else { + log::error!("ROOT_PARENT should not be part of layers_dragging"); + false + } + }); + + let mut selected = Selected::new( + &mut bounds.original_transforms, + &mut bounds.center_of_transformation, + &selected, + responses, + &document.network_interface, + None, + &ToolType::Select, + None, + ); + + bounds.center_of_transformation = selected.mean_average_of_pivots(); + } + + *layers_dragging = selected; + + // No resize or skew, just rotate + return (false, true, false); + } + + // No resize, rotate, or skew + return (false, false, false); +} + /// Calculates similarity metric between new bezier curve and two old beziers by using sampled points. #[allow(clippy::too_many_arguments)] pub fn log_optimization(a: f64, b: f64, p1: DVec2, p3: DVec2, d1: DVec2, d2: DVec2, points1: &[DVec2], n: usize) -> f64 { diff --git a/editor/src/messages/tool/tool_message.rs b/editor/src/messages/tool/tool_message.rs index 2f90076954..6a5d893e38 100644 --- a/editor/src/messages/tool/tool_message.rs +++ b/editor/src/messages/tool/tool_message.rs @@ -32,13 +32,7 @@ pub enum ToolMessage { #[child] Spline(SplineToolMessage), #[child] - Line(LineToolMessage), - #[child] - Rectangle(RectangleToolMessage), - #[child] - Ellipse(EllipseToolMessage), - #[child] - Polygon(PolygonToolMessage), + Shape(ShapeToolMessage), #[child] Text(TextToolMessage), @@ -62,7 +56,6 @@ pub enum ToolMessage { ActivateToolArtboard, ActivateToolNavigate, ActivateToolEyedropper, - ActivateToolText, ActivateToolFill, ActivateToolGradient, @@ -70,10 +63,11 @@ pub enum ToolMessage { ActivateToolPen, ActivateToolFreehand, ActivateToolSpline, - ActivateToolLine, - ActivateToolRectangle, - ActivateToolEllipse, - ActivateToolPolygon, + ActivateToolShapeLine, + ActivateToolShapeRectangle, + ActivateToolShapeEllipse, + ActivateToolShape, + ActivateToolText, ActivateToolBrush, // ActivateToolImaginate, diff --git a/editor/src/messages/tool/tool_message_handler.rs b/editor/src/messages/tool/tool_message_handler.rs index f2818f4405..badf9ac5f3 100644 --- a/editor/src/messages/tool/tool_message_handler.rs +++ b/editor/src/messages/tool/tool_message_handler.rs @@ -1,4 +1,5 @@ use super::common_functionality::shape_editor::ShapeState; +use super::common_functionality::shapes::shape_utility::ShapeType::{self, Ellipse, Line, Rectangle}; use super::utility_types::{ToolActionHandlerData, ToolFsmState, tool_message_to_tool_type}; use crate::application::generate_uuid; use crate::messages::layout::utility_types::widget_prelude::*; @@ -58,21 +59,47 @@ impl MessageHandler> for ToolMessageHandler { ToolMessage::ActivateToolPen => responses.add_front(ToolMessage::ActivateTool { tool_type: ToolType::Pen }), ToolMessage::ActivateToolFreehand => responses.add_front(ToolMessage::ActivateTool { tool_type: ToolType::Freehand }), ToolMessage::ActivateToolSpline => responses.add_front(ToolMessage::ActivateTool { tool_type: ToolType::Spline }), - ToolMessage::ActivateToolLine => responses.add_front(ToolMessage::ActivateTool { tool_type: ToolType::Line }), - ToolMessage::ActivateToolRectangle => responses.add_front(ToolMessage::ActivateTool { tool_type: ToolType::Rectangle }), - ToolMessage::ActivateToolEllipse => responses.add_front(ToolMessage::ActivateTool { tool_type: ToolType::Ellipse }), - ToolMessage::ActivateToolPolygon => responses.add_front(ToolMessage::ActivateTool { tool_type: ToolType::Polygon }), - + ToolMessage::ActivateToolShape => { + if self.tool_state.tool_data.active_shape_type.is_some() { + self.tool_state.tool_data.active_shape_type = None; + self.tool_state.tool_data.active_tool_type = ToolType::Shape; + } + responses.add_front(ToolMessage::ActivateTool { tool_type: ToolType::Shape }); + responses.add(ShapeToolMessage::SetShape(ShapeType::Polygon)); + responses.add(ShapeToolMessage::HideShapeTypeWidget(false)) + } ToolMessage::ActivateToolBrush => responses.add_front(ToolMessage::ActivateTool { tool_type: ToolType::Brush }), + ToolMessage::ActivateToolShapeLine | ToolMessage::ActivateToolShapeRectangle | ToolMessage::ActivateToolShapeEllipse => { + let shape = match message { + ToolMessage::ActivateToolShapeLine => Line, + ToolMessage::ActivateToolShapeRectangle => Rectangle, + ToolMessage::ActivateToolShapeEllipse => Ellipse, + _ => unreachable!(), + }; + + self.tool_state.tool_data.active_shape_type = Some(shape.tool_type()); + responses.add_front(ToolMessage::ActivateTool { tool_type: ToolType::Shape }); + responses.add(ShapeToolMessage::HideShapeTypeWidget(true)); + responses.add(ShapeToolMessage::SetShape(shape)); + } // ToolMessage::ActivateToolImaginate => responses.add_front(ToolMessage::ActivateTool { tool_type: ToolType::Imaginate }), ToolMessage::ActivateTool { tool_type } => { let tool_data = &mut self.tool_state.tool_data; - let old_tool = tool_data.active_tool_type; + let old_tool = tool_data.active_tool_type.get_tool(); + let tool_type = tool_type.get_tool(); + + responses.add(ToolMessage::RefreshToolOptions); + tool_data.send_layout(responses, LayoutTarget::ToolShelf); // Do nothing if switching to the same tool if self.tool_is_active && tool_type == old_tool { return; } + + if tool_type != ToolType::Shape { + tool_data.active_shape_type = None; + } + self.tool_is_active = true; // Send the old and new tools a transition to their FSM Abort states @@ -299,7 +326,6 @@ impl MessageHandler> for ToolMessageHandler { ActivateToolArtboard, ActivateToolNavigate, ActivateToolEyedropper, - ActivateToolText, ActivateToolFill, ActivateToolGradient, @@ -307,10 +333,11 @@ impl MessageHandler> for ToolMessageHandler { ActivateToolPen, ActivateToolFreehand, ActivateToolSpline, - ActivateToolLine, - ActivateToolRectangle, - ActivateToolEllipse, - ActivateToolPolygon, + ActivateToolShapeLine, + ActivateToolShapeRectangle, + ActivateToolShapeEllipse, + ActivateToolShape, + ActivateToolText, ActivateToolBrush, // ActivateToolImaginate, diff --git a/editor/src/messages/tool/tool_messages/ellipse_tool.rs b/editor/src/messages/tool/tool_messages/ellipse_tool.rs deleted file mode 100644 index 0f64ef06e3..0000000000 --- a/editor/src/messages/tool/tool_messages/ellipse_tool.rs +++ /dev/null @@ -1,444 +0,0 @@ -use super::tool_prelude::*; -use crate::consts::DEFAULT_STROKE_WIDTH; -use crate::messages::portfolio::document::graph_operation::utility_types::TransformIn; -use crate::messages::portfolio::document::node_graph::document_node_definitions::resolve_document_node_type; -use crate::messages::portfolio::document::overlays::utility_types::OverlayContext; -use crate::messages::portfolio::document::utility_types::network_interface::InputConnector; -use crate::messages::tool::common_functionality::auto_panning::AutoPanning; -use crate::messages::tool::common_functionality::color_selector::{ToolColorOptions, ToolColorType}; -use crate::messages::tool::common_functionality::graph_modification_utils; -use crate::messages::tool::common_functionality::resize::Resize; -use crate::messages::tool::common_functionality::snapping::SnapData; -use graph_craft::document::value::TaggedValue; -use graph_craft::document::{NodeId, NodeInput}; -use graphene_std::Color; - -#[derive(Default)] -pub struct EllipseTool { - fsm_state: EllipseToolFsmState, - data: EllipseToolData, - options: EllipseToolOptions, -} - -pub struct EllipseToolOptions { - line_weight: f64, - fill: ToolColorOptions, - stroke: ToolColorOptions, -} - -impl Default for EllipseToolOptions { - fn default() -> Self { - Self { - line_weight: DEFAULT_STROKE_WIDTH, - fill: ToolColorOptions::new_secondary(), - stroke: ToolColorOptions::new_primary(), - } - } -} - -#[derive(PartialEq, Clone, Debug, serde::Serialize, serde::Deserialize, specta::Type)] -pub enum EllipseOptionsUpdate { - FillColor(Option), - FillColorType(ToolColorType), - LineWeight(f64), - StrokeColor(Option), - StrokeColorType(ToolColorType), - WorkingColors(Option, Option), -} - -#[impl_message(Message, ToolMessage, Ellipse)] -#[derive(PartialEq, Clone, Debug, serde::Serialize, serde::Deserialize, specta::Type)] -pub enum EllipseToolMessage { - // Standard messages - Overlays(OverlayContext), - Abort, - WorkingColorChanged, - - // Tool-specific messages - DragStart, - DragStop, - PointerMove { center: Key, lock_ratio: Key }, - PointerOutsideViewport { center: Key, lock_ratio: Key }, - UpdateOptions(EllipseOptionsUpdate), -} - -impl ToolMetadata for EllipseTool { - fn icon_name(&self) -> String { - "VectorEllipseTool".into() - } - fn tooltip(&self) -> String { - "Ellipse Tool".into() - } - fn tool_type(&self) -> crate::messages::tool::utility_types::ToolType { - ToolType::Ellipse - } -} - -fn create_weight_widget(line_weight: f64) -> WidgetHolder { - NumberInput::new(Some(line_weight)) - .unit(" px") - .label("Weight") - .min(0.) - .max((1_u64 << f64::MANTISSA_DIGITS) as f64) - .on_update(|number_input: &NumberInput| EllipseToolMessage::UpdateOptions(EllipseOptionsUpdate::LineWeight(number_input.value.unwrap())).into()) - .widget_holder() -} - -impl LayoutHolder for EllipseTool { - fn layout(&self) -> Layout { - let mut widgets = self.options.fill.create_widgets( - "Fill", - true, - |_| EllipseToolMessage::UpdateOptions(EllipseOptionsUpdate::FillColor(None)).into(), - |color_type: ToolColorType| WidgetCallback::new(move |_| EllipseToolMessage::UpdateOptions(EllipseOptionsUpdate::FillColorType(color_type.clone())).into()), - |color: &ColorInput| EllipseToolMessage::UpdateOptions(EllipseOptionsUpdate::FillColor(color.value.as_solid().map(|color| color.to_linear_srgb()))).into(), - ); - - widgets.push(Separator::new(SeparatorType::Unrelated).widget_holder()); - - widgets.append(&mut self.options.stroke.create_widgets( - "Stroke", - true, - |_| EllipseToolMessage::UpdateOptions(EllipseOptionsUpdate::StrokeColor(None)).into(), - |color_type: ToolColorType| WidgetCallback::new(move |_| EllipseToolMessage::UpdateOptions(EllipseOptionsUpdate::StrokeColorType(color_type.clone())).into()), - |color: &ColorInput| EllipseToolMessage::UpdateOptions(EllipseOptionsUpdate::StrokeColor(color.value.as_solid().map(|color| color.to_linear_srgb()))).into(), - )); - widgets.push(Separator::new(SeparatorType::Unrelated).widget_holder()); - widgets.push(create_weight_widget(self.options.line_weight)); - - Layout::WidgetLayout(WidgetLayout::new(vec![LayoutGroup::Row { widgets }])) - } -} - -impl<'a> MessageHandler> for EllipseTool { - fn process_message(&mut self, message: ToolMessage, responses: &mut VecDeque, tool_data: &mut ToolActionHandlerData<'a>) { - let ToolMessage::Ellipse(EllipseToolMessage::UpdateOptions(action)) = message else { - self.fsm_state.process_event(message, &mut self.data, tool_data, &self.options, responses, true); - return; - }; - match action { - EllipseOptionsUpdate::FillColor(color) => { - self.options.fill.custom_color = color; - self.options.fill.color_type = ToolColorType::Custom; - } - EllipseOptionsUpdate::FillColorType(color_type) => self.options.fill.color_type = color_type, - EllipseOptionsUpdate::LineWeight(line_weight) => self.options.line_weight = line_weight, - EllipseOptionsUpdate::StrokeColor(color) => { - self.options.stroke.custom_color = color; - self.options.stroke.color_type = ToolColorType::Custom; - } - EllipseOptionsUpdate::StrokeColorType(color_type) => self.options.stroke.color_type = color_type, - EllipseOptionsUpdate::WorkingColors(primary, secondary) => { - self.options.stroke.primary_working_color = primary; - self.options.stroke.secondary_working_color = secondary; - self.options.fill.primary_working_color = primary; - self.options.fill.secondary_working_color = secondary; - } - } - - self.send_layout(responses, LayoutTarget::ToolOptions); - } - - fn actions(&self) -> ActionList { - match self.fsm_state { - EllipseToolFsmState::Ready => actions!(EllipseToolMessageDiscriminant; - DragStart, - PointerMove, - ), - EllipseToolFsmState::Drawing => actions!(EllipseToolMessageDiscriminant; - DragStop, - Abort, - PointerMove, - ), - } - } -} - -impl ToolTransition for EllipseTool { - fn event_to_message_map(&self) -> EventToMessageMap { - EventToMessageMap { - overlay_provider: Some(|overlay_context| EllipseToolMessage::Overlays(overlay_context).into()), - tool_abort: Some(EllipseToolMessage::Abort.into()), - working_color_changed: Some(EllipseToolMessage::WorkingColorChanged.into()), - ..Default::default() - } - } -} - -#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] -enum EllipseToolFsmState { - #[default] - Ready, - Drawing, -} - -#[derive(Clone, Debug, Default)] -struct EllipseToolData { - data: Resize, - auto_panning: AutoPanning, -} - -impl Fsm for EllipseToolFsmState { - type ToolData = EllipseToolData; - type ToolOptions = EllipseToolOptions; - - fn transition(self, event: ToolMessage, tool_data: &mut Self::ToolData, tool_action_data: &mut ToolActionHandlerData, tool_options: &Self::ToolOptions, responses: &mut VecDeque) -> Self { - let ToolActionHandlerData { - document, global_tool_data, input, .. - } = tool_action_data; - - let shape_data = &mut tool_data.data; - - let ToolMessage::Ellipse(event) = event else { return self }; - match (self, event) { - (_, EllipseToolMessage::Overlays(mut overlay_context)) => { - shape_data.snap_manager.draw_overlays(SnapData::new(document, input), &mut overlay_context); - self - } - (EllipseToolFsmState::Ready, EllipseToolMessage::DragStart) => { - shape_data.start(document, input); - responses.add(DocumentMessage::StartTransaction); - - // Create a new ellipse vector shape - let node_type = resolve_document_node_type("Ellipse").expect("Ellipse node does not exist"); - let node = node_type.node_template_input_override([None, Some(NodeInput::value(TaggedValue::F64(0.5), false)), Some(NodeInput::value(TaggedValue::F64(0.5), false))]); - let nodes = vec![(NodeId(0), node)]; - - let layer = graph_modification_utils::new_custom(NodeId::new(), nodes, document.new_layer_bounding_artboard(input), responses); - responses.add(Message::StartBuffer); - responses.add(GraphOperationMessage::TransformSet { - layer, - transform: DAffine2::from_scale_angle_translation(DVec2::ONE, 0., input.mouse.position), - transform_in: TransformIn::Viewport, - skip_rerender: false, - }); - tool_options.fill.apply_fill(layer, responses); - tool_options.stroke.apply_stroke(tool_options.line_weight, layer, responses); - shape_data.layer = Some(layer); - - EllipseToolFsmState::Drawing - } - (EllipseToolFsmState::Drawing, EllipseToolMessage::PointerMove { center, lock_ratio }) => { - if let Some([start, end]) = shape_data.calculate_points(document, input, center, lock_ratio) { - if let Some(layer) = shape_data.layer { - let Some(node_id) = graph_modification_utils::get_ellipse_id(layer, &document.network_interface) else { - return self; - }; - - responses.add(NodeGraphMessage::SetInput { - input_connector: InputConnector::node(node_id, 1), - input: NodeInput::value(TaggedValue::F64(((start.x - end.x) / 2.).abs()), false), - }); - responses.add(NodeGraphMessage::SetInput { - input_connector: InputConnector::node(node_id, 2), - input: NodeInput::value(TaggedValue::F64(((start.y - end.y) / 2.).abs()), false), - }); - responses.add(GraphOperationMessage::TransformSet { - layer, - transform: DAffine2::from_translation((start + end) / 2.), - transform_in: TransformIn::Viewport, - skip_rerender: false, - }); - } - } - - // Auto-panning - let messages = [ - EllipseToolMessage::PointerOutsideViewport { center, lock_ratio }.into(), - EllipseToolMessage::PointerMove { center, lock_ratio }.into(), - ]; - tool_data.auto_panning.setup_by_mouse_position(input, &messages, responses); - - self - } - (_, EllipseToolMessage::PointerMove { .. }) => { - shape_data.snap_manager.preview_draw(&SnapData::new(document, input), input.mouse.position); - responses.add(OverlaysMessage::Draw); - self - } - (EllipseToolFsmState::Drawing, EllipseToolMessage::PointerOutsideViewport { .. }) => { - // Auto-panning - let _ = tool_data.auto_panning.shift_viewport(input, responses); - - EllipseToolFsmState::Drawing - } - (state, EllipseToolMessage::PointerOutsideViewport { center, lock_ratio }) => { - // Auto-panning - let messages = [ - EllipseToolMessage::PointerOutsideViewport { center, lock_ratio }.into(), - EllipseToolMessage::PointerMove { center, lock_ratio }.into(), - ]; - tool_data.auto_panning.stop(&messages, responses); - - state - } - (EllipseToolFsmState::Drawing, EllipseToolMessage::DragStop) => { - input.mouse.finish_transaction(shape_data.viewport_drag_start(document), responses); - shape_data.cleanup(responses); - - EllipseToolFsmState::Ready - } - (EllipseToolFsmState::Drawing, EllipseToolMessage::Abort) => { - responses.add(DocumentMessage::AbortTransaction); - shape_data.cleanup(responses); - - EllipseToolFsmState::Ready - } - (_, EllipseToolMessage::WorkingColorChanged) => { - responses.add(EllipseToolMessage::UpdateOptions(EllipseOptionsUpdate::WorkingColors( - Some(global_tool_data.primary_color), - Some(global_tool_data.secondary_color), - ))); - self - } - _ => self, - } - } - - fn update_hints(&self, responses: &mut VecDeque) { - let hint_data = match self { - EllipseToolFsmState::Ready => HintData(vec![HintGroup(vec![ - HintInfo::mouse(MouseMotion::LmbDrag, "Draw Ellipse"), - HintInfo::keys([Key::Shift], "Constrain Circular").prepend_plus(), - HintInfo::keys([Key::Alt], "From Center").prepend_plus(), - ])]), - EllipseToolFsmState::Drawing => HintData(vec![ - HintGroup(vec![HintInfo::mouse(MouseMotion::Rmb, ""), HintInfo::keys([Key::Escape], "Cancel").prepend_slash()]), - HintGroup(vec![HintInfo::keys([Key::Shift], "Constrain Circular"), HintInfo::keys([Key::Alt], "From Center")]), - ]), - }; - - responses.add(FrontendMessage::UpdateInputHints { hint_data }); - } - - fn update_cursor(&self, responses: &mut VecDeque) { - responses.add(FrontendMessage::UpdateMouseCursor { cursor: MouseCursorIcon::Crosshair }); - } -} - -#[cfg(test)] -mod test_ellipse { - pub use crate::test_utils::test_prelude::*; - use glam::DAffine2; - use graphene_std::vector::generator_nodes::ellipse; - - #[derive(Debug, PartialEq)] - struct ResolvedEllipse { - radius_x: f64, - radius_y: f64, - transform: DAffine2, - } - - async fn get_ellipse(editor: &mut EditorTestUtils) -> Vec { - let instrumented = match editor.eval_graph().await { - Ok(instrumented) => instrumented, - Err(e) => panic!("Failed to evaluate graph: {e}"), - }; - - let document = editor.active_document(); - let layers = document.metadata().all_layers(); - layers - .filter_map(|layer| { - let node_graph_layer = NodeGraphLayer::new(layer, &document.network_interface); - let ellipse_node = node_graph_layer.upstream_node_id_from_protonode(ellipse::protonode_identifier())?; - Some(ResolvedEllipse { - radius_x: instrumented.grab_protonode_input::(&vec![ellipse_node], &editor.runtime).unwrap(), - radius_y: instrumented.grab_protonode_input::(&vec![ellipse_node], &editor.runtime).unwrap(), - transform: document.metadata().transform_to_document(layer), - }) - }) - .collect() - } - - #[tokio::test] - async fn ellipse_draw_simple() { - let mut editor = EditorTestUtils::create(); - editor.new_document().await; - editor.drag_tool(ToolType::Ellipse, 10., 10., 19., 0., ModifierKeys::empty()).await; - - assert_eq!(editor.active_document().metadata().all_layers().count(), 1); - - let ellipse = get_ellipse(&mut editor).await; - assert_eq!(ellipse.len(), 1); - assert_eq!( - ellipse[0], - ResolvedEllipse { - radius_x: 4.5, - radius_y: 5., - transform: DAffine2::from_translation(DVec2::new(14.5, 5.)) // Uses center - } - ); - } - - #[tokio::test] - async fn ellipse_draw_circle() { - let mut editor = EditorTestUtils::create(); - editor.new_document().await; - editor.drag_tool(ToolType::Ellipse, 10., 10., -10., 11., ModifierKeys::SHIFT).await; - - let ellipse = get_ellipse(&mut editor).await; - assert_eq!(ellipse.len(), 1); - assert_eq!( - ellipse[0], - ResolvedEllipse { - radius_x: 10., - radius_y: 10., - transform: DAffine2::from_translation(DVec2::new(0., 20.)) // Uses center - } - ); - } - - #[tokio::test] - async fn ellipse_draw_square_rotated() { - let mut editor = EditorTestUtils::create(); - editor.new_document().await; - editor - .handle_message(NavigationMessage::CanvasTiltSet { - // 45 degree rotation of content clockwise - angle_radians: f64::consts::FRAC_PI_4, - }) - .await; - editor.drag_tool(ToolType::Ellipse, 0., 0., 1., 10., ModifierKeys::SHIFT).await; // Viewport coordinates - - let ellipse = get_ellipse(&mut editor).await; - assert_eq!(ellipse.len(), 1); - println!("{ellipse:?}"); - assert_eq!(ellipse[0].radius_x, 5.); - assert_eq!(ellipse[0].radius_y, 5.); - - assert!( - ellipse[0] - .transform - .abs_diff_eq(DAffine2::from_angle_translation(-f64::consts::FRAC_PI_4, DVec2::X * f64::consts::FRAC_1_SQRT_2 * 10.), 0.001) - ); - } - - #[tokio::test] - async fn ellipse_draw_center_square_rotated() { - let mut editor = EditorTestUtils::create(); - editor.new_document().await; - editor - .handle_message(NavigationMessage::CanvasTiltSet { - // 45 degree rotation of content clockwise - angle_radians: f64::consts::FRAC_PI_4, - }) - .await; - editor.drag_tool(ToolType::Ellipse, 0., 0., 1., 10., ModifierKeys::SHIFT | ModifierKeys::ALT).await; // Viewport coordinates - - let ellipse = get_ellipse(&mut editor).await; - assert_eq!(ellipse.len(), 1); - assert_eq!(ellipse[0].radius_x, 10.); - assert_eq!(ellipse[0].radius_y, 10.); - assert!(ellipse[0].transform.abs_diff_eq(DAffine2::from_angle(-f64::consts::FRAC_PI_4), 0.001)); - } - - #[tokio::test] - async fn ellipse_cancel() { - let mut editor = EditorTestUtils::create(); - editor.new_document().await; - editor.drag_tool_cancel_rmb(ToolType::Ellipse).await; - - let ellipse = get_ellipse(&mut editor).await; - assert_eq!(ellipse.len(), 0); - } -} diff --git a/editor/src/messages/tool/tool_messages/gradient_tool.rs b/editor/src/messages/tool/tool_messages/gradient_tool.rs index 519db67d96..6265c64b1e 100644 --- a/editor/src/messages/tool/tool_messages/gradient_tool.rs +++ b/editor/src/messages/tool/tool_messages/gradient_tool.rs @@ -535,7 +535,8 @@ impl Fsm for GradientToolFsmState { mod test_gradient { use crate::messages::input_mapper::utility_types::input_mouse::EditorMouseState; use crate::messages::input_mapper::utility_types::input_mouse::ScrollDelta; - use crate::messages::portfolio::document::{graph_operation::utility_types::TransformIn, utility_types::misc::GroupFolderType}; + use crate::messages::portfolio::document::graph_operation::utility_types::TransformIn; + use crate::messages::portfolio::document::utility_types::misc::GroupFolderType; pub use crate::test_utils::test_prelude::*; use glam::DAffine2; use graphene_std::vector::fill; diff --git a/editor/src/messages/tool/tool_messages/line_tool.rs b/editor/src/messages/tool/tool_messages/line_tool.rs deleted file mode 100644 index 0200f420d5..0000000000 --- a/editor/src/messages/tool/tool_messages/line_tool.rs +++ /dev/null @@ -1,624 +0,0 @@ -use super::tool_prelude::*; -use crate::consts::{BOUNDS_SELECT_THRESHOLD, DEFAULT_STROKE_WIDTH, LINE_ROTATE_SNAP_ANGLE}; -use crate::messages::portfolio::document::node_graph::document_node_definitions::resolve_document_node_type; -use crate::messages::portfolio::document::overlays::utility_types::OverlayContext; -use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier; -use crate::messages::portfolio::document::utility_types::network_interface::InputConnector; -use crate::messages::tool::common_functionality::auto_panning::AutoPanning; -use crate::messages::tool::common_functionality::color_selector::{ToolColorOptions, ToolColorType}; -use crate::messages::tool::common_functionality::graph_modification_utils::{self, NodeGraphLayer}; -use crate::messages::tool::common_functionality::snapping::{SnapCandidatePoint, SnapConstraint, SnapData, SnapManager, SnapTypeConfiguration}; -use graph_craft::document::value::TaggedValue; -use graph_craft::document::{NodeId, NodeInput}; -use graphene_std::Color; - -#[derive(Default)] -pub struct LineTool { - fsm_state: LineToolFsmState, - tool_data: LineToolData, - options: LineOptions, -} - -pub struct LineOptions { - line_weight: f64, - stroke: ToolColorOptions, -} - -impl Default for LineOptions { - fn default() -> Self { - Self { - line_weight: DEFAULT_STROKE_WIDTH, - stroke: ToolColorOptions::new_primary(), - } - } -} - -#[impl_message(Message, ToolMessage, Line)] -#[derive(PartialEq, Clone, Debug, serde::Serialize, serde::Deserialize, specta::Type)] -pub enum LineToolMessage { - // Standard messages - Overlays(OverlayContext), - Abort, - WorkingColorChanged, - - // Tool-specific messages - DragStart, - DragStop, - PointerMove { center: Key, lock_angle: Key, snap_angle: Key }, - PointerOutsideViewport { center: Key, lock_angle: Key, snap_angle: Key }, - UpdateOptions(LineOptionsUpdate), -} - -#[derive(PartialEq, Clone, Debug, serde::Serialize, serde::Deserialize, specta::Type)] -pub enum LineOptionsUpdate { - LineWeight(f64), - StrokeColor(Option), - StrokeColorType(ToolColorType), - WorkingColors(Option, Option), -} - -impl ToolMetadata for LineTool { - fn icon_name(&self) -> String { - "VectorLineTool".into() - } - fn tooltip(&self) -> String { - "Line Tool".into() - } - fn tool_type(&self) -> crate::messages::tool::utility_types::ToolType { - ToolType::Line - } -} - -fn create_weight_widget(line_weight: f64) -> WidgetHolder { - NumberInput::new(Some(line_weight)) - .unit(" px") - .label("Weight") - .min(0.) - .max((1_u64 << f64::MANTISSA_DIGITS) as f64) - .on_update(|number_input: &NumberInput| LineToolMessage::UpdateOptions(LineOptionsUpdate::LineWeight(number_input.value.unwrap())).into()) - .widget_holder() -} - -impl LayoutHolder for LineTool { - fn layout(&self) -> Layout { - let mut widgets = self.options.stroke.create_widgets( - "Stroke", - true, - |_| LineToolMessage::UpdateOptions(LineOptionsUpdate::StrokeColor(None)).into(), - |color_type: ToolColorType| WidgetCallback::new(move |_| LineToolMessage::UpdateOptions(LineOptionsUpdate::StrokeColorType(color_type.clone())).into()), - |color: &ColorInput| LineToolMessage::UpdateOptions(LineOptionsUpdate::StrokeColor(color.value.as_solid().map(|color| color.to_linear_srgb()))).into(), - ); - widgets.push(Separator::new(SeparatorType::Unrelated).widget_holder()); - widgets.push(create_weight_widget(self.options.line_weight)); - - Layout::WidgetLayout(WidgetLayout::new(vec![LayoutGroup::Row { widgets }])) - } -} - -impl<'a> MessageHandler> for LineTool { - fn process_message(&mut self, message: ToolMessage, responses: &mut VecDeque, tool_data: &mut ToolActionHandlerData<'a>) { - let ToolMessage::Line(LineToolMessage::UpdateOptions(action)) = message else { - self.fsm_state.process_event(message, &mut self.tool_data, tool_data, &self.options, responses, true); - return; - }; - match action { - LineOptionsUpdate::LineWeight(line_weight) => self.options.line_weight = line_weight, - LineOptionsUpdate::StrokeColor(color) => { - self.options.stroke.custom_color = color; - self.options.stroke.color_type = ToolColorType::Custom; - } - LineOptionsUpdate::StrokeColorType(color_type) => self.options.stroke.color_type = color_type, - LineOptionsUpdate::WorkingColors(primary, secondary) => { - self.options.stroke.primary_working_color = primary; - self.options.stroke.secondary_working_color = secondary; - } - } - - self.send_layout(responses, LayoutTarget::ToolOptions); - } - - fn actions(&self) -> ActionList { - match self.fsm_state { - LineToolFsmState::Ready => actions!(LineToolMessageDiscriminant; DragStart, PointerMove), - LineToolFsmState::Drawing => actions!(LineToolMessageDiscriminant; DragStop, PointerMove, Abort), - } - } -} - -impl ToolTransition for LineTool { - fn event_to_message_map(&self) -> EventToMessageMap { - EventToMessageMap { - overlay_provider: Some(|overlay_context| LineToolMessage::Overlays(overlay_context).into()), - tool_abort: Some(LineToolMessage::Abort.into()), - working_color_changed: Some(LineToolMessage::WorkingColorChanged.into()), - ..Default::default() - } - } -} - -#[derive(Clone, Copy, Debug, PartialEq, Eq, Default)] -enum LineToolFsmState { - #[default] - Ready, - Drawing, -} - -#[derive(Clone, Copy, Debug, PartialEq, Eq)] -enum LineEnd { - Start, - End, -} - -#[derive(Clone, Debug, Default)] -struct LineToolData { - drag_begin: DVec2, - drag_start_shifted: DVec2, - drag_current_shifted: DVec2, - drag_start: DVec2, - drag_current: DVec2, - angle: f64, - weight: f64, - selected_layers_with_position: HashMap, - editing_layer: Option, - snap_manager: SnapManager, - auto_panning: AutoPanning, - dragging_endpoint: Option, -} - -impl Fsm for LineToolFsmState { - type ToolData = LineToolData; - type ToolOptions = LineOptions; - - fn transition(self, event: ToolMessage, tool_data: &mut Self::ToolData, tool_action_data: &mut ToolActionHandlerData, tool_options: &Self::ToolOptions, responses: &mut VecDeque) -> Self { - let ToolActionHandlerData { - document, global_tool_data, input, .. - } = tool_action_data; - - let ToolMessage::Line(event) = event else { return self }; - match (self, event) { - (_, LineToolMessage::Overlays(mut overlay_context)) => { - tool_data.snap_manager.draw_overlays(SnapData::new(document, input), &mut overlay_context); - - tool_data.selected_layers_with_position = document - .network_interface - .selected_nodes() - .selected_visible_and_unlocked_layers(&document.network_interface) - .filter_map(|layer| { - let node_inputs = NodeGraphLayer::new(layer, &document.network_interface).find_node_inputs("Line")?; - - let (Some(&TaggedValue::DVec2(start)), Some(&TaggedValue::DVec2(end))) = (node_inputs[1].as_value(), node_inputs[2].as_value()) else { - return None; - }; - - let [viewport_start, viewport_end] = [start, end].map(|point| document.metadata().transform_to_viewport(layer).transform_point2(point)); - if !start.abs_diff_eq(end, f64::EPSILON * 1000.) { - overlay_context.line(viewport_start, viewport_end, None, None); - overlay_context.square(viewport_start, Some(6.), None, None); - overlay_context.square(viewport_end, Some(6.), None, None); - } - - Some((layer, [start, end])) - }) - .collect::>(); - - self - } - (LineToolFsmState::Ready, LineToolMessage::DragStart) => { - let point = SnapCandidatePoint::handle(document.metadata().document_to_viewport.inverse().transform_point2(input.mouse.position)); - let snapped = tool_data.snap_manager.free_snap(&SnapData::new(document, input), &point, SnapTypeConfiguration::default()); - tool_data.drag_start = snapped.snapped_point_document; - tool_data.drag_begin = document.metadata().document_to_viewport.transform_point2(tool_data.drag_start); - - responses.add(DocumentMessage::StartTransaction); - - for (layer, [document_start, document_end]) in tool_data.selected_layers_with_position.iter() { - let transform = document.metadata().transform_to_viewport(*layer); - let viewport_x = transform.transform_vector2(DVec2::X).normalize_or_zero() * BOUNDS_SELECT_THRESHOLD; - let viewport_y = transform.transform_vector2(DVec2::Y).normalize_or_zero() * BOUNDS_SELECT_THRESHOLD; - let threshold_x = transform.inverse().transform_vector2(viewport_x).length(); - let threshold_y = transform.inverse().transform_vector2(viewport_y).length(); - - let drag_start = input.mouse.position; - let [start, end] = [document_start, document_end].map(|point| transform.transform_point2(*point)); - - let start_click = (drag_start.y - start.y).abs() < threshold_y && (drag_start.x - start.x).abs() < threshold_x; - let end_click = (drag_start.y - end.y).abs() < threshold_y && (drag_start.x - end.x).abs() < threshold_x; - - if start_click || end_click { - tool_data.dragging_endpoint = Some(if end_click { LineEnd::End } else { LineEnd::Start }); - tool_data.drag_start = if end_click { *document_start } else { *document_end }; - tool_data.editing_layer = Some(*layer); - return LineToolFsmState::Drawing; - } - } - - let node_type = resolve_document_node_type("Line").expect("Line node does not exist"); - let node = node_type.node_template_input_override([ - None, - Some(NodeInput::value( - TaggedValue::DVec2(document.metadata().document_to_viewport.transform_point2(tool_data.drag_start)), - false, - )), - Some(NodeInput::value( - TaggedValue::DVec2(document.metadata().document_to_viewport.transform_point2(tool_data.drag_start)), - false, - )), - ]); - let nodes = vec![(NodeId(0), node)]; - - let layer = graph_modification_utils::new_custom(NodeId::new(), nodes, document.new_layer_bounding_artboard(input), responses); - responses.add(Message::StartBuffer); - - tool_options.stroke.apply_stroke(tool_options.line_weight, layer, responses); - - tool_data.editing_layer = Some(layer); - tool_data.angle = 0.; - tool_data.weight = tool_options.line_weight; - - LineToolFsmState::Drawing - } - (LineToolFsmState::Drawing, LineToolMessage::PointerMove { center, snap_angle, lock_angle }) => { - let Some(layer) = tool_data.editing_layer else { return LineToolFsmState::Ready }; - - tool_data.drag_current_shifted = document.metadata().transform_to_viewport(layer).inverse().transform_point2(input.mouse.position); - tool_data.drag_current = document.metadata().document_to_viewport.inverse().transform_point2(input.mouse.position); - tool_data.drag_start_shifted = document.metadata().transform_to_viewport(layer).inverse().transform_point2(tool_data.drag_begin); - - let keyboard = &input.keyboard; - let ignore = vec![layer]; - let snap_data = SnapData::ignore(document, input, &ignore); - let mut document_points = generate_line(tool_data, snap_data, keyboard.key(lock_angle), keyboard.key(snap_angle), keyboard.key(center)); - - if tool_data.dragging_endpoint == Some(LineEnd::Start) { - document_points.swap(0, 1); - } - - let Some(node_id) = graph_modification_utils::get_line_id(layer, &document.network_interface) else { - return LineToolFsmState::Ready; - }; - - responses.add(NodeGraphMessage::SetInput { - input_connector: InputConnector::node(node_id, 1), - input: NodeInput::value(TaggedValue::DVec2(document_points[0]), false), - }); - responses.add(NodeGraphMessage::SetInput { - input_connector: InputConnector::node(node_id, 2), - input: NodeInput::value(TaggedValue::DVec2(document_points[1]), false), - }); - responses.add(NodeGraphMessage::RunDocumentGraph); - - // Auto-panning - let messages = [ - LineToolMessage::PointerOutsideViewport { center, snap_angle, lock_angle }.into(), - LineToolMessage::PointerMove { center, snap_angle, lock_angle }.into(), - ]; - tool_data.auto_panning.setup_by_mouse_position(input, &messages, responses); - - LineToolFsmState::Drawing - } - (_, LineToolMessage::PointerMove { .. }) => { - tool_data.snap_manager.preview_draw(&SnapData::new(document, input), input.mouse.position); - responses.add(OverlaysMessage::Draw); - self - } - (LineToolFsmState::Drawing, LineToolMessage::PointerOutsideViewport { .. }) => { - // Auto-panning - let _ = tool_data.auto_panning.shift_viewport(input, responses); - - LineToolFsmState::Drawing - } - (state, LineToolMessage::PointerOutsideViewport { center, lock_angle, snap_angle }) => { - // Auto-panning - let messages = [ - LineToolMessage::PointerOutsideViewport { center, lock_angle, snap_angle }.into(), - LineToolMessage::PointerMove { center, lock_angle, snap_angle }.into(), - ]; - tool_data.auto_panning.stop(&messages, responses); - - state - } - (LineToolFsmState::Drawing, LineToolMessage::DragStop) => { - tool_data.snap_manager.cleanup(responses); - tool_data.editing_layer.take(); - input.mouse.finish_transaction(tool_data.drag_start, responses); - LineToolFsmState::Ready - } - (LineToolFsmState::Drawing, LineToolMessage::Abort) => { - tool_data.snap_manager.cleanup(responses); - tool_data.editing_layer.take(); - responses.add(DocumentMessage::AbortTransaction); - LineToolFsmState::Ready - } - (_, LineToolMessage::WorkingColorChanged) => { - responses.add(LineToolMessage::UpdateOptions(LineOptionsUpdate::WorkingColors( - Some(global_tool_data.primary_color), - Some(global_tool_data.secondary_color), - ))); - self - } - _ => self, - } - } - - fn update_hints(&self, responses: &mut VecDeque) { - let hint_data = match self { - LineToolFsmState::Ready => HintData(vec![HintGroup(vec![ - HintInfo::mouse(MouseMotion::LmbDrag, "Draw Line"), - HintInfo::keys([Key::Shift], "15° Increments").prepend_plus(), - HintInfo::keys([Key::Alt], "From Center").prepend_plus(), - HintInfo::keys([Key::Control], "Lock Angle").prepend_plus(), - ])]), - LineToolFsmState::Drawing => HintData(vec![ - HintGroup(vec![HintInfo::mouse(MouseMotion::Rmb, ""), HintInfo::keys([Key::Escape], "Cancel").prepend_slash()]), - HintGroup(vec![ - HintInfo::keys([Key::Shift], "15° Increments"), - HintInfo::keys([Key::Alt], "From Center"), - HintInfo::keys([Key::Control], "Lock Angle"), - ]), - ]), - }; - - responses.add(FrontendMessage::UpdateInputHints { hint_data }); - } - - fn update_cursor(&self, responses: &mut VecDeque) { - responses.add(FrontendMessage::UpdateMouseCursor { cursor: MouseCursorIcon::Crosshair }); - } -} - -fn generate_line(tool_data: &mut LineToolData, snap_data: SnapData, lock_angle: bool, snap_angle: bool, center: bool) -> [DVec2; 2] { - let shift = tool_data.drag_current_shifted - tool_data.drag_current; - let mut document_points = [tool_data.drag_start, tool_data.drag_current]; - - let mut angle = -(document_points[1] - document_points[0]).angle_to(DVec2::X); - let mut line_length = (document_points[1] - document_points[0]).length(); - - if lock_angle { - angle = tool_data.angle; - } else if snap_angle { - let snap_resolution = LINE_ROTATE_SNAP_ANGLE.to_radians(); - angle = (angle / snap_resolution).round() * snap_resolution; - } - - tool_data.angle = angle; - - let angle_vec = DVec2::from_angle(angle); - if lock_angle { - line_length = (document_points[1] - document_points[0]).dot(angle_vec); - } - - document_points[1] = document_points[0] + line_length * angle_vec; - - let constrained = snap_angle || lock_angle; - let snap = &mut tool_data.snap_manager; - - let near_point = SnapCandidatePoint::handle_neighbors(document_points[1], [tool_data.drag_start]); - let far_point = SnapCandidatePoint::handle_neighbors(2. * document_points[0] - document_points[1], [tool_data.drag_start]); - let mid_point = SnapCandidatePoint::handle_neighbors((tool_data.drag_start + document_points[1]) / 2., [tool_data.drag_start]); - let config = SnapTypeConfiguration::default(); - - if constrained { - let constraint = SnapConstraint::Line { - origin: document_points[0], - direction: document_points[1] - document_points[0], - }; - if center { - let snapped = snap.constrained_snap(&snap_data, &near_point, constraint, config); - let snapped_far = snap.constrained_snap(&snap_data, &far_point, constraint, config); - let best = if snapped_far.other_snap_better(&snapped) { snapped } else { snapped_far }; - document_points[1] = document_points[0] * 2. - best.snapped_point_document; - document_points[0] = best.snapped_point_document; - snap.update_indicator(best); - } else { - let snapped = snap.constrained_snap(&snap_data, &near_point, constraint, config); - let snapped_mid = snap.constrained_snap(&snap_data, &mid_point, constraint, config); - let best = if snap_data.document.snapping_state.path.line_midpoint && snapped_mid.other_snap_better(&snapped_mid) { - document_points[1] += (snapped_mid.snapped_point_document - mid_point.document_point) * 2.; - snapped_mid - } else { - document_points[1] = snapped.snapped_point_document; - snapped.clone() - }; - snap.update_indicator(best); - } - } else if center { - let snapped = snap.free_snap(&snap_data, &near_point, config); - let snapped_far = snap.free_snap(&snap_data, &far_point, config); - let best = if snapped_far.other_snap_better(&snapped) { snapped } else { snapped_far }; - document_points[1] = document_points[0] * 2. - best.snapped_point_document; - document_points[0] = best.snapped_point_document; - snap.update_indicator(best); - } else { - let snapped = snap.free_snap(&snap_data, &near_point, config); - let snapped_mid = snap.free_snap(&snap_data, &mid_point, config); - let best = if snap_data.document.snapping_state.path.line_midpoint && snapped_mid.other_snap_better(&snapped_mid) { - document_points[1] += (snapped_mid.snapped_point_document - mid_point.document_point) * 2.; - snapped_mid - } else { - document_points[1] = snapped.snapped_point_document; - snapped.clone() - }; - snap.update_indicator(best); - } - - // Snapping happens in other space, while document graph renders in another. - document_points.map(|vector| vector + shift) -} - -#[cfg(test)] -mod test_line_tool { - use crate::messages::portfolio::document::graph_operation::utility_types::TransformIn; - use crate::messages::tool::common_functionality::graph_modification_utils::NodeGraphLayer; - use crate::test_utils::test_prelude::*; - use glam::DAffine2; - use graph_craft::document::value::TaggedValue; - - async fn get_line_node_inputs(editor: &mut EditorTestUtils) -> Option<(DVec2, DVec2)> { - let document = editor.active_document(); - let network_interface = &document.network_interface; - let node_id = network_interface - .selected_nodes() - .selected_visible_and_unlocked_layers(network_interface) - .filter_map(|layer| { - let node_inputs = NodeGraphLayer::new(layer, &network_interface).find_node_inputs("Line")?; - let (Some(&TaggedValue::DVec2(start)), Some(&TaggedValue::DVec2(end))) = (node_inputs[1].as_value(), node_inputs[2].as_value()) else { - return None; - }; - Some((start, end)) - }) - .next(); - node_id - } - - #[tokio::test] - async fn test_line_tool_basicdraw() { - let mut editor = EditorTestUtils::create(); - editor.new_document().await; - editor.drag_tool(ToolType::Line, 0., 0., 100., 100., ModifierKeys::empty()).await; - if let Some((start_input, end_input)) = get_line_node_inputs(&mut editor).await { - match (start_input, end_input) { - (start_input, end_input) => { - assert!((start_input - DVec2::ZERO).length() < 1., "Start point should be near (0,0)"); - assert!((end_input - DVec2::new(100., 100.)).length() < 1., "End point should be near (100,100)"); - } - } - } - } - - #[tokio::test] - async fn test_line_tool_with_transformed_viewport() { - let mut editor = EditorTestUtils::create(); - editor.new_document().await; - editor.handle_message(NavigationMessage::CanvasZoomSet { zoom_factor: 2. }).await; - editor.handle_message(NavigationMessage::CanvasPan { delta: DVec2::new(100., 50.) }).await; - editor - .handle_message(NavigationMessage::CanvasTiltSet { - angle_radians: (30. as f64).to_radians(), - }) - .await; - editor.drag_tool(ToolType::Line, 0., 0., 100., 100., ModifierKeys::empty()).await; - if let Some((start_input, end_input)) = get_line_node_inputs(&mut editor).await { - let document = editor.active_document(); - let document_to_viewport = document.metadata().document_to_viewport; - let viewport_to_document = document_to_viewport.inverse(); - - let expected_start = viewport_to_document.transform_point2(DVec2::ZERO); - let expected_end = viewport_to_document.transform_point2(DVec2::new(100., 100.)); - - assert!( - (start_input - expected_start).length() < 1., - "Start point should match expected document coordinates. Got {:?}, expected {:?}", - start_input, - expected_start - ); - assert!( - (end_input - expected_end).length() < 1., - "End point should match expected document coordinates. Got {:?}, expected {:?}", - end_input, - expected_end - ); - } else { - panic!("Line was not created successfully with transformed viewport"); - } - } - - #[tokio::test] - async fn test_line_tool_ctrl_anglelock() { - let mut editor = EditorTestUtils::create(); - editor.new_document().await; - editor.drag_tool(ToolType::Line, 0., 0., 100., 100., ModifierKeys::CONTROL).await; - if let Some((start_input, end_input)) = get_line_node_inputs(&mut editor).await { - match (start_input, end_input) { - (start_input, end_input) => { - let line_vec = end_input - start_input; - let original_angle = line_vec.angle_to(DVec2::X); - editor.drag_tool(ToolType::Line, 0., 0., 200., 50., ModifierKeys::CONTROL).await; - if let Some((updated_start, updated_end)) = get_line_node_inputs(&mut editor).await { - match (updated_start, updated_end) { - (updated_start, updated_end) => { - let updated_line_vec = updated_end - updated_start; - let updated_angle = updated_line_vec.angle_to(DVec2::X); - assert!((original_angle - updated_angle).abs() < 0.1, "Line angle should be locked when Ctrl is kept pressed"); - assert!((updated_start - updated_end).length() > 1., "Line should be able to change length when Ctrl is kept pressed"); - } - } - } - } - } - } - } - - #[tokio::test] - async fn test_line_tool_alt() { - let mut editor = EditorTestUtils::create(); - editor.new_document().await; - editor.drag_tool(ToolType::Line, 100., 100., 200., 100., ModifierKeys::ALT).await; - if let Some((start_input, end_input)) = get_line_node_inputs(&mut editor).await { - match (start_input, end_input) { - (start_input, end_input) => { - let expected_start = DVec2::new(0., 100.); - let expected_end = DVec2::new(200., 100.); - assert!((start_input - expected_start).length() < 1., "start point should be near (0,100)"); - assert!((end_input - expected_end).length() < 1., "end point should be near (200,100)"); - } - } - } - } - - #[tokio::test] - async fn test_line_tool_alt_shift_drag() { - let mut editor = EditorTestUtils::create(); - editor.new_document().await; - editor.drag_tool(ToolType::Line, 100., 100., 150., 120., ModifierKeys::ALT | ModifierKeys::SHIFT).await; - if let Some((start_input, end_input)) = get_line_node_inputs(&mut editor).await { - match (start_input, end_input) { - (start_input, end_input) => { - let line_vec = end_input - start_input; - let angle_radians = line_vec.angle_to(DVec2::X); - let angle_degrees = angle_radians.to_degrees(); - let nearest_angle = (angle_degrees / 15.).round() * 15.; - - assert!((angle_degrees - nearest_angle).abs() < 1., "Angle should snap to the nearest 15 degrees"); - } - } - } - } - - #[tokio::test] - async fn test_line_tool_with_transformed_artboard() { - let mut editor = EditorTestUtils::create(); - editor.new_document().await; - editor.drag_tool(ToolType::Artboard, 0., 0., 200., 200., ModifierKeys::empty()).await; - - let artboard_id = editor.get_selected_layer().await.expect("Should have selected the artboard"); - - editor - .handle_message(GraphOperationMessage::TransformChange { - layer: artboard_id, - transform: DAffine2::from_angle(45.0_f64.to_radians()), - transform_in: TransformIn::Local, - skip_rerender: false, - }) - .await; - - editor.drag_tool(ToolType::Line, 50., 50., 150., 150., ModifierKeys::empty()).await; - - let (start_input, end_input) = get_line_node_inputs(&mut editor).await.expect("Line was not created successfully within transformed artboard"); - // The line should still be diagonal with equal change in x and y - let line_vector = end_input - start_input; - // Verifying the line is approximately 100*sqrt(2) units in length (diagonal of 100x100 square) - let line_length = line_vector.length(); - assert!( - (line_length - 141.42).abs() < 1.0, // 100 * sqrt(2) ~= 141.42 - "Line length should be approximately 141.42 units. Got: {line_length}" - ); - assert!((line_vector.x - 100.0).abs() < 1.0, "X-component of line vector should be approximately 100. Got: {}", line_vector.x); - assert!( - (line_vector.y.abs() - 100.0).abs() < 1.0, - "Absolute Y-component of line vector should be approximately 100. Got: {}", - line_vector.y.abs() - ); - let angle_degrees = line_vector.angle_to(DVec2::X).to_degrees(); - assert!((angle_degrees - (-45.0)).abs() < 1.0, "Line angle should be close to -45 degrees. Got: {angle_degrees}"); - } -} diff --git a/editor/src/messages/tool/tool_messages/mod.rs b/editor/src/messages/tool/tool_messages/mod.rs index 65ac871ab2..b11a20ec09 100644 --- a/editor/src/messages/tool/tool_messages/mod.rs +++ b/editor/src/messages/tool/tool_messages/mod.rs @@ -1,18 +1,15 @@ pub mod artboard_tool; pub mod brush_tool; -pub mod ellipse_tool; pub mod eyedropper_tool; pub mod fill_tool; pub mod freehand_tool; pub mod gradient_tool; // pub mod imaginate_tool; -pub mod line_tool; pub mod navigate_tool; pub mod path_tool; pub mod pen_tool; -pub mod polygon_tool; -pub mod rectangle_tool; pub mod select_tool; +pub mod shape_tool; pub mod spline_tool; pub mod text_tool; diff --git a/editor/src/messages/tool/tool_messages/polygon_tool.rs b/editor/src/messages/tool/tool_messages/polygon_tool.rs deleted file mode 100644 index 5b5b617095..0000000000 --- a/editor/src/messages/tool/tool_messages/polygon_tool.rs +++ /dev/null @@ -1,436 +0,0 @@ -use super::tool_prelude::*; -use crate::consts::DEFAULT_STROKE_WIDTH; -use crate::messages::portfolio::document::graph_operation::utility_types::TransformIn; -use crate::messages::portfolio::document::node_graph::document_node_definitions::resolve_document_node_type; -use crate::messages::portfolio::document::overlays::utility_types::OverlayContext; -use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier; -use crate::messages::portfolio::document::utility_types::network_interface::InputConnector; -use crate::messages::tool::common_functionality::auto_panning::AutoPanning; -use crate::messages::tool::common_functionality::color_selector::{ToolColorOptions, ToolColorType}; -use crate::messages::tool::common_functionality::graph_modification_utils::{self, NodeGraphLayer}; -use crate::messages::tool::common_functionality::resize::Resize; -use crate::messages::tool::common_functionality::snapping::SnapData; -use graph_craft::document::value::TaggedValue; -use graph_craft::document::{NodeId, NodeInput}; -use graphene_std::Color; - -#[derive(Default)] -pub struct PolygonTool { - fsm_state: PolygonToolFsmState, - tool_data: PolygonToolData, - options: PolygonOptions, -} - -pub struct PolygonOptions { - line_weight: f64, - fill: ToolColorOptions, - stroke: ToolColorOptions, - vertices: u32, - polygon_type: PolygonType, -} - -impl Default for PolygonOptions { - fn default() -> Self { - Self { - vertices: 5, - line_weight: DEFAULT_STROKE_WIDTH, - fill: ToolColorOptions::new_secondary(), - stroke: ToolColorOptions::new_primary(), - polygon_type: PolygonType::Convex, - } - } -} - -#[impl_message(Message, ToolMessage, Polygon)] -#[derive(PartialEq, Clone, Debug, serde::Serialize, serde::Deserialize, specta::Type)] -pub enum PolygonToolMessage { - // Standard messages - Overlays(OverlayContext), - Abort, - WorkingColorChanged, - - // Tool-specific messages - DragStart, - DragStop, - PointerMove { center: Key, lock_ratio: Key }, - PointerOutsideViewport { center: Key, lock_ratio: Key }, - UpdateOptions(PolygonOptionsUpdate), -} - -#[derive(PartialEq, Copy, Clone, Debug, serde::Serialize, serde::Deserialize, specta::Type)] -pub enum PolygonType { - Convex = 0, - Star = 1, -} - -#[derive(PartialEq, Clone, Debug, serde::Serialize, serde::Deserialize, specta::Type)] -pub enum PolygonOptionsUpdate { - FillColor(Option), - FillColorType(ToolColorType), - LineWeight(f64), - PolygonType(PolygonType), - StrokeColor(Option), - StrokeColorType(ToolColorType), - Vertices(u32), - WorkingColors(Option, Option), -} - -impl ToolMetadata for PolygonTool { - fn icon_name(&self) -> String { - "VectorPolygonTool".into() - } - fn tooltip(&self) -> String { - "Polygon Tool".into() - } - fn tool_type(&self) -> crate::messages::tool::utility_types::ToolType { - ToolType::Polygon - } -} - -fn create_sides_widget(vertices: u32) -> WidgetHolder { - NumberInput::new(Some(vertices as f64)) - .label("Sides") - .int() - .min(3.) - .max(1000.) - .mode(NumberInputMode::Increment) - .on_update(|number_input: &NumberInput| PolygonToolMessage::UpdateOptions(PolygonOptionsUpdate::Vertices(number_input.value.unwrap() as u32)).into()) - .widget_holder() -} - -fn create_star_option_widget(polygon_type: PolygonType) -> WidgetHolder { - let entries = vec![ - RadioEntryData::new("convex") - .label("Convex") - .on_update(move |_| PolygonToolMessage::UpdateOptions(PolygonOptionsUpdate::PolygonType(PolygonType::Convex)).into()), - RadioEntryData::new("star") - .label("Star") - .on_update(move |_| PolygonToolMessage::UpdateOptions(PolygonOptionsUpdate::PolygonType(PolygonType::Star)).into()), - ]; - RadioInput::new(entries).selected_index(Some(polygon_type as u32)).widget_holder() -} - -fn create_weight_widget(line_weight: f64) -> WidgetHolder { - NumberInput::new(Some(line_weight)) - .unit(" px") - .label("Weight") - .min(0.) - .max((1_u64 << f64::MANTISSA_DIGITS) as f64) - .on_update(|number_input: &NumberInput| PolygonToolMessage::UpdateOptions(PolygonOptionsUpdate::LineWeight(number_input.value.unwrap())).into()) - .widget_holder() -} - -impl LayoutHolder for PolygonTool { - fn layout(&self) -> Layout { - let mut widgets = vec![ - create_star_option_widget(self.options.polygon_type), - Separator::new(SeparatorType::Related).widget_holder(), - create_sides_widget(self.options.vertices), - ]; - - widgets.push(Separator::new(SeparatorType::Unrelated).widget_holder()); - - widgets.append(&mut self.options.fill.create_widgets( - "Fill", - true, - |_| PolygonToolMessage::UpdateOptions(PolygonOptionsUpdate::FillColor(None)).into(), - |color_type: ToolColorType| WidgetCallback::new(move |_| PolygonToolMessage::UpdateOptions(PolygonOptionsUpdate::FillColorType(color_type.clone())).into()), - |color: &ColorInput| PolygonToolMessage::UpdateOptions(PolygonOptionsUpdate::FillColor(color.value.as_solid().map(|color| color.to_linear_srgb()))).into(), - )); - - widgets.push(Separator::new(SeparatorType::Unrelated).widget_holder()); - - widgets.append(&mut self.options.stroke.create_widgets( - "Stroke", - true, - |_| PolygonToolMessage::UpdateOptions(PolygonOptionsUpdate::StrokeColor(None)).into(), - |color_type: ToolColorType| WidgetCallback::new(move |_| PolygonToolMessage::UpdateOptions(PolygonOptionsUpdate::StrokeColorType(color_type.clone())).into()), - |color: &ColorInput| PolygonToolMessage::UpdateOptions(PolygonOptionsUpdate::StrokeColor(color.value.as_solid().map(|color| color.to_linear_srgb()))).into(), - )); - widgets.push(Separator::new(SeparatorType::Unrelated).widget_holder()); - widgets.push(create_weight_widget(self.options.line_weight)); - - Layout::WidgetLayout(WidgetLayout::new(vec![LayoutGroup::Row { widgets }])) - } -} -impl<'a> MessageHandler> for PolygonTool { - fn process_message(&mut self, message: ToolMessage, responses: &mut VecDeque, tool_data: &mut ToolActionHandlerData<'a>) { - let ToolMessage::Polygon(PolygonToolMessage::UpdateOptions(action)) = message else { - self.fsm_state.process_event(message, &mut self.tool_data, tool_data, &self.options, responses, true); - return; - }; - match action { - PolygonOptionsUpdate::Vertices(vertices) => self.options.vertices = vertices, - PolygonOptionsUpdate::PolygonType(polygon_type) => self.options.polygon_type = polygon_type, - PolygonOptionsUpdate::FillColor(color) => { - self.options.fill.custom_color = color; - self.options.fill.color_type = ToolColorType::Custom; - } - PolygonOptionsUpdate::FillColorType(color_type) => self.options.fill.color_type = color_type, - PolygonOptionsUpdate::LineWeight(line_weight) => self.options.line_weight = line_weight, - PolygonOptionsUpdate::StrokeColor(color) => { - self.options.stroke.custom_color = color; - self.options.stroke.color_type = ToolColorType::Custom; - } - PolygonOptionsUpdate::StrokeColorType(color_type) => self.options.stroke.color_type = color_type, - PolygonOptionsUpdate::WorkingColors(primary, secondary) => { - self.options.stroke.primary_working_color = primary; - self.options.stroke.secondary_working_color = secondary; - self.options.fill.primary_working_color = primary; - self.options.fill.secondary_working_color = secondary; - } - } - - self.send_layout(responses, LayoutTarget::ToolOptions); - } - - fn actions(&self) -> ActionList { - match self.fsm_state { - PolygonToolFsmState::Ready => actions!(PolygonToolMessageDiscriminant; - DragStart, - PointerMove, - ), - PolygonToolFsmState::Drawing => actions!(PolygonToolMessageDiscriminant; - DragStop, - Abort, - PointerMove, - ), - } - } -} - -impl ToolTransition for PolygonTool { - fn event_to_message_map(&self) -> EventToMessageMap { - EventToMessageMap { - overlay_provider: Some(|overlay_context| PolygonToolMessage::Overlays(overlay_context).into()), - tool_abort: Some(PolygonToolMessage::Abort.into()), - working_color_changed: Some(PolygonToolMessage::WorkingColorChanged.into()), - ..Default::default() - } - } -} - -#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] -enum PolygonToolFsmState { - #[default] - Ready, - Drawing, -} - -#[derive(Clone, Debug, Default)] -struct PolygonToolData { - data: Resize, - auto_panning: AutoPanning, -} - -impl Fsm for PolygonToolFsmState { - type ToolData = PolygonToolData; - type ToolOptions = PolygonOptions; - - fn transition(self, event: ToolMessage, tool_data: &mut Self::ToolData, tool_action_data: &mut ToolActionHandlerData, tool_options: &Self::ToolOptions, responses: &mut VecDeque) -> Self { - let ToolActionHandlerData { - document, global_tool_data, input, .. - } = tool_action_data; - - let polygon_data = &mut tool_data.data; - - let ToolMessage::Polygon(event) = event else { return self }; - match (self, event) { - (_, PolygonToolMessage::Overlays(mut overlay_context)) => { - polygon_data.snap_manager.draw_overlays(SnapData::new(document, input), &mut overlay_context); - self - } - (PolygonToolFsmState::Ready, PolygonToolMessage::DragStart) => { - polygon_data.start(document, input); - responses.add(DocumentMessage::StartTransaction); - - let node = match tool_options.polygon_type { - PolygonType::Convex => resolve_document_node_type("Regular Polygon") - .expect("Regular Polygon node does not exist") - .node_template_input_override([ - None, - Some(NodeInput::value(TaggedValue::U32(tool_options.vertices), false)), - Some(NodeInput::value(TaggedValue::F64(0.5), false)), - ]), - PolygonType::Star => resolve_document_node_type("Star").expect("Star node does not exist").node_template_input_override([ - None, - Some(NodeInput::value(TaggedValue::U32(tool_options.vertices), false)), - Some(NodeInput::value(TaggedValue::F64(0.5), false)), - Some(NodeInput::value(TaggedValue::F64(0.25), false)), - ]), - }; - - let nodes = vec![(NodeId(0), node)]; - - let layer = graph_modification_utils::new_custom(NodeId::new(), nodes, document.new_layer_bounding_artboard(input), responses); - responses.add(Message::StartBuffer); - responses.add(GraphOperationMessage::TransformSet { - layer, - transform: DAffine2::from_scale_angle_translation(DVec2::ONE, 0., input.mouse.position), - transform_in: TransformIn::Viewport, - skip_rerender: false, - }); - tool_options.fill.apply_fill(layer, responses); - tool_options.stroke.apply_stroke(tool_options.line_weight, layer, responses); - polygon_data.layer = Some(layer); - - PolygonToolFsmState::Drawing - } - (PolygonToolFsmState::Drawing, PolygonToolMessage::PointerMove { center, lock_ratio }) => { - if let Some([start, end]) = tool_data.data.calculate_points(document, input, center, lock_ratio) { - if let Some(layer) = tool_data.data.layer { - // TODO: We need to determine how to allow the polygon node to make irregular shapes - update_radius_sign(end, start, layer, document, responses); - - let dimensions = (start - end).abs(); - let mut scale = DVec2::ONE; - let radius: f64; - - // We keep the smaller dimension's scale at 1 and scale the other dimension accordingly - if dimensions.x > dimensions.y { - scale.x = dimensions.x / dimensions.y; - radius = dimensions.y / 2.; - } else { - scale.y = dimensions.y / dimensions.x; - radius = dimensions.x / 2.; - } - - match tool_options.polygon_type { - PolygonType::Convex => { - let Some(node_id) = graph_modification_utils::get_polygon_id(layer, &document.network_interface) else { - return self; - }; - - responses.add(NodeGraphMessage::SetInput { - input_connector: InputConnector::node(node_id, 2), - input: NodeInput::value(TaggedValue::F64(radius), false), - }); - } - PolygonType::Star => { - let Some(node_id) = graph_modification_utils::get_star_id(layer, &document.network_interface) else { - return self; - }; - - responses.add(NodeGraphMessage::SetInput { - input_connector: InputConnector::node(node_id, 2), - input: NodeInput::value(TaggedValue::F64(radius), false), - }); - responses.add(NodeGraphMessage::SetInput { - input_connector: InputConnector::node(node_id, 3), - input: NodeInput::value(TaggedValue::F64(radius / 2.), false), - }); - } - } - - responses.add(GraphOperationMessage::TransformSet { - layer, - transform: DAffine2::from_scale_angle_translation(scale, 0., (start + end) / 2.), - transform_in: TransformIn::Viewport, - skip_rerender: false, - }); - } - } - - // Auto-panning - let messages = [ - PolygonToolMessage::PointerOutsideViewport { center, lock_ratio }.into(), - PolygonToolMessage::PointerMove { center, lock_ratio }.into(), - ]; - tool_data.auto_panning.setup_by_mouse_position(input, &messages, responses); - - self - } - (_, PolygonToolMessage::PointerMove { .. }) => { - polygon_data.snap_manager.preview_draw(&SnapData::new(document, input), input.mouse.position); - responses.add(OverlaysMessage::Draw); - self - } - (PolygonToolFsmState::Drawing, PolygonToolMessage::PointerOutsideViewport { .. }) => { - // Auto-panning - let _ = tool_data.auto_panning.shift_viewport(input, responses); - - PolygonToolFsmState::Drawing - } - (state, PolygonToolMessage::PointerOutsideViewport { center, lock_ratio }) => { - // Auto-panning - let messages = [ - PolygonToolMessage::PointerOutsideViewport { center, lock_ratio }.into(), - PolygonToolMessage::PointerMove { center, lock_ratio }.into(), - ]; - tool_data.auto_panning.stop(&messages, responses); - - state - } - (PolygonToolFsmState::Drawing, PolygonToolMessage::DragStop) => { - input.mouse.finish_transaction(polygon_data.viewport_drag_start(document), responses); - polygon_data.cleanup(responses); - - PolygonToolFsmState::Ready - } - (PolygonToolFsmState::Drawing, PolygonToolMessage::Abort) => { - responses.add(DocumentMessage::AbortTransaction); - - polygon_data.cleanup(responses); - - PolygonToolFsmState::Ready - } - (_, PolygonToolMessage::WorkingColorChanged) => { - responses.add(PolygonToolMessage::UpdateOptions(PolygonOptionsUpdate::WorkingColors( - Some(global_tool_data.primary_color), - Some(global_tool_data.secondary_color), - ))); - self - } - _ => self, - } - } - - fn update_hints(&self, responses: &mut VecDeque) { - let hint_data = match self { - PolygonToolFsmState::Ready => HintData(vec![HintGroup(vec![ - HintInfo::mouse(MouseMotion::LmbDrag, "Draw Polygon"), - HintInfo::keys([Key::Shift], "Constrain Regular").prepend_plus(), - HintInfo::keys([Key::Alt], "From Center").prepend_plus(), - ])]), - PolygonToolFsmState::Drawing => HintData(vec![ - HintGroup(vec![HintInfo::mouse(MouseMotion::Rmb, ""), HintInfo::keys([Key::Escape], "Cancel").prepend_slash()]), - HintGroup(vec![HintInfo::keys([Key::Shift], "Constrain Regular"), HintInfo::keys([Key::Alt], "From Center")]), - ]), - }; - - responses.add(FrontendMessage::UpdateInputHints { hint_data }); - } - - fn update_cursor(&self, responses: &mut VecDeque) { - responses.add(FrontendMessage::UpdateMouseCursor { cursor: MouseCursorIcon::Crosshair }); - } -} - -/// In the case where the polygon/star is upside down and the number of sides is odd, we negate the radius instead of using a negative scale. -fn update_radius_sign(end: DVec2, start: DVec2, layer: LayerNodeIdentifier, document: &mut DocumentMessageHandler, responses: &mut VecDeque) { - let sign_num = if end[1] > start[1] { 1. } else { -1. }; - let new_layer = NodeGraphLayer::new(layer, &document.network_interface); - - if new_layer.find_input("Regular Polygon", 1).unwrap_or(&TaggedValue::U32(0)).to_u32() % 2 == 1 { - let Some(polygon_node_id) = new_layer.upstream_node_id_from_name("Regular Polygon") else { return }; - - responses.add(NodeGraphMessage::SetInput { - input_connector: InputConnector::node(polygon_node_id, 2), - input: NodeInput::value(TaggedValue::F64(sign_num * 0.5), false), - }); - return; - } - - if new_layer.find_input("Star", 1).unwrap_or(&TaggedValue::U32(0)).to_u32() % 2 == 1 { - let Some(star_node_id) = new_layer.upstream_node_id_from_name("Star") else { return }; - - responses.add(NodeGraphMessage::SetInput { - input_connector: InputConnector::node(star_node_id, 2), - input: NodeInput::value(TaggedValue::F64(sign_num * 0.5), false), - }); - responses.add(NodeGraphMessage::SetInput { - input_connector: InputConnector::node(star_node_id, 3), - input: NodeInput::value(TaggedValue::F64(sign_num * 0.25), false), - }); - } -} diff --git a/editor/src/messages/tool/tool_messages/rectangle_tool.rs b/editor/src/messages/tool/tool_messages/rectangle_tool.rs deleted file mode 100644 index 3092e9ceef..0000000000 --- a/editor/src/messages/tool/tool_messages/rectangle_tool.rs +++ /dev/null @@ -1,323 +0,0 @@ -use super::tool_prelude::*; -use crate::consts::DEFAULT_STROKE_WIDTH; -use crate::messages::portfolio::document::graph_operation::utility_types::TransformIn; -use crate::messages::portfolio::document::node_graph::document_node_definitions::resolve_document_node_type; -use crate::messages::portfolio::document::overlays::utility_types::OverlayContext; -use crate::messages::portfolio::document::utility_types::network_interface::InputConnector; -use crate::messages::tool::common_functionality::auto_panning::AutoPanning; -use crate::messages::tool::common_functionality::color_selector::{ToolColorOptions, ToolColorType}; -use crate::messages::tool::common_functionality::graph_modification_utils; -use crate::messages::tool::common_functionality::resize::Resize; -use crate::messages::tool::common_functionality::snapping::SnapData; -use graph_craft::document::value::TaggedValue; -use graph_craft::document::{NodeId, NodeInput}; -use graphene_std::Color; - -#[derive(Default)] -pub struct RectangleTool { - fsm_state: RectangleToolFsmState, - tool_data: RectangleToolData, - options: RectangleToolOptions, -} - -pub struct RectangleToolOptions { - line_weight: f64, - fill: ToolColorOptions, - stroke: ToolColorOptions, -} - -impl Default for RectangleToolOptions { - fn default() -> Self { - Self { - line_weight: DEFAULT_STROKE_WIDTH, - fill: ToolColorOptions::new_secondary(), - stroke: ToolColorOptions::new_primary(), - } - } -} - -#[derive(PartialEq, Clone, Debug, serde::Serialize, serde::Deserialize, specta::Type)] -pub enum RectangleOptionsUpdate { - FillColor(Option), - FillColorType(ToolColorType), - LineWeight(f64), - StrokeColor(Option), - StrokeColorType(ToolColorType), - WorkingColors(Option, Option), -} - -#[impl_message(Message, ToolMessage, Rectangle)] -#[derive(PartialEq, Clone, Debug, serde::Serialize, serde::Deserialize, specta::Type)] -pub enum RectangleToolMessage { - // Standard messages - Overlays(OverlayContext), - Abort, - WorkingColorChanged, - - // Tool-specific messages - DragStart, - DragStop, - PointerMove { center: Key, lock_ratio: Key }, - PointerOutsideViewport { center: Key, lock_ratio: Key }, - UpdateOptions(RectangleOptionsUpdate), -} - -fn create_weight_widget(line_weight: f64) -> WidgetHolder { - NumberInput::new(Some(line_weight)) - .unit(" px") - .label("Weight") - .min(0.) - .max((1_u64 << f64::MANTISSA_DIGITS) as f64) - .on_update(|number_input: &NumberInput| RectangleToolMessage::UpdateOptions(RectangleOptionsUpdate::LineWeight(number_input.value.unwrap())).into()) - .widget_holder() -} - -impl LayoutHolder for RectangleTool { - fn layout(&self) -> Layout { - let mut widgets = self.options.fill.create_widgets( - "Fill", - true, - |_| RectangleToolMessage::UpdateOptions(RectangleOptionsUpdate::FillColor(None)).into(), - |color_type: ToolColorType| WidgetCallback::new(move |_| RectangleToolMessage::UpdateOptions(RectangleOptionsUpdate::FillColorType(color_type.clone())).into()), - |color: &ColorInput| RectangleToolMessage::UpdateOptions(RectangleOptionsUpdate::FillColor(color.value.as_solid().map(|color| color.to_linear_srgb()))).into(), - ); - - widgets.push(Separator::new(SeparatorType::Unrelated).widget_holder()); - - widgets.append(&mut self.options.stroke.create_widgets( - "Stroke", - true, - |_| RectangleToolMessage::UpdateOptions(RectangleOptionsUpdate::StrokeColor(None)).into(), - |color_type: ToolColorType| WidgetCallback::new(move |_| RectangleToolMessage::UpdateOptions(RectangleOptionsUpdate::StrokeColorType(color_type.clone())).into()), - |color: &ColorInput| RectangleToolMessage::UpdateOptions(RectangleOptionsUpdate::StrokeColor(color.value.as_solid().map(|color| color.to_linear_srgb()))).into(), - )); - widgets.push(Separator::new(SeparatorType::Unrelated).widget_holder()); - widgets.push(create_weight_widget(self.options.line_weight)); - - Layout::WidgetLayout(WidgetLayout::new(vec![LayoutGroup::Row { widgets }])) - } -} - -impl<'a> MessageHandler> for RectangleTool { - fn process_message(&mut self, message: ToolMessage, responses: &mut VecDeque, tool_data: &mut ToolActionHandlerData<'a>) { - let ToolMessage::Rectangle(RectangleToolMessage::UpdateOptions(action)) = message else { - self.fsm_state.process_event(message, &mut self.tool_data, tool_data, &self.options, responses, true); - return; - }; - match action { - RectangleOptionsUpdate::FillColor(color) => { - self.options.fill.custom_color = color; - self.options.fill.color_type = ToolColorType::Custom; - } - RectangleOptionsUpdate::FillColorType(color_type) => self.options.fill.color_type = color_type, - RectangleOptionsUpdate::LineWeight(line_weight) => self.options.line_weight = line_weight, - RectangleOptionsUpdate::StrokeColor(color) => { - self.options.stroke.custom_color = color; - self.options.stroke.color_type = ToolColorType::Custom; - } - RectangleOptionsUpdate::StrokeColorType(color_type) => self.options.stroke.color_type = color_type, - RectangleOptionsUpdate::WorkingColors(primary, secondary) => { - self.options.stroke.primary_working_color = primary; - self.options.stroke.secondary_working_color = secondary; - self.options.fill.primary_working_color = primary; - self.options.fill.secondary_working_color = secondary; - } - } - - self.send_layout(responses, LayoutTarget::ToolOptions); - } - - fn actions(&self) -> ActionList { - match self.fsm_state { - RectangleToolFsmState::Ready => actions!(RectangleToolMessageDiscriminant; - DragStart, - PointerMove, - ), - RectangleToolFsmState::Drawing => actions!(RectangleToolMessageDiscriminant; - DragStop, - Abort, - PointerMove, - ), - } - } -} - -impl ToolMetadata for RectangleTool { - fn icon_name(&self) -> String { - "VectorRectangleTool".into() - } - fn tooltip(&self) -> String { - "Rectangle Tool".into() - } - fn tool_type(&self) -> crate::messages::tool::utility_types::ToolType { - ToolType::Rectangle - } -} - -impl ToolTransition for RectangleTool { - fn event_to_message_map(&self) -> EventToMessageMap { - EventToMessageMap { - overlay_provider: Some(|overlay_context| RectangleToolMessage::Overlays(overlay_context).into()), - tool_abort: Some(RectangleToolMessage::Abort.into()), - working_color_changed: Some(RectangleToolMessage::WorkingColorChanged.into()), - ..Default::default() - } - } -} - -#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] -enum RectangleToolFsmState { - #[default] - Ready, - Drawing, -} - -#[derive(Clone, Debug, Default)] -struct RectangleToolData { - data: Resize, - auto_panning: AutoPanning, -} - -impl Fsm for RectangleToolFsmState { - type ToolData = RectangleToolData; - type ToolOptions = RectangleToolOptions; - - fn transition( - self, - event: ToolMessage, - tool_data: &mut Self::ToolData, - ToolActionHandlerData { - document, global_tool_data, input, .. - }: &mut ToolActionHandlerData, - tool_options: &Self::ToolOptions, - responses: &mut VecDeque, - ) -> Self { - let shape_data = &mut tool_data.data; - - let ToolMessage::Rectangle(event) = event else { return self }; - match (self, event) { - (_, RectangleToolMessage::Overlays(mut overlay_context)) => { - shape_data.snap_manager.draw_overlays(SnapData::new(document, input), &mut overlay_context); - self - } - (RectangleToolFsmState::Ready, RectangleToolMessage::DragStart) => { - shape_data.start(document, input); - - responses.add(DocumentMessage::StartTransaction); - - let node_type = resolve_document_node_type("Rectangle").expect("Rectangle node does not exist"); - let node = node_type.node_template_input_override([None, Some(NodeInput::value(TaggedValue::F64(1.), false)), Some(NodeInput::value(TaggedValue::F64(1.), false))]); - let nodes = vec![(NodeId(0), node)]; - - let layer = graph_modification_utils::new_custom(NodeId::new(), nodes, document.new_layer_bounding_artboard(input), responses); - responses.add(Message::StartBuffer); - responses.add(GraphOperationMessage::TransformSet { - layer, - transform: DAffine2::from_scale_angle_translation(DVec2::ONE, 0., input.mouse.position), - transform_in: TransformIn::Viewport, - skip_rerender: false, - }); - tool_options.fill.apply_fill(layer, responses); - tool_options.stroke.apply_stroke(tool_options.line_weight, layer, responses); - shape_data.layer = Some(layer); - - RectangleToolFsmState::Drawing - } - (RectangleToolFsmState::Drawing, RectangleToolMessage::PointerMove { center, lock_ratio }) => { - if let Some([start, end]) = shape_data.calculate_points(document, input, center, lock_ratio) { - if let Some(layer) = shape_data.layer { - let Some(node_id) = graph_modification_utils::get_rectangle_id(layer, &document.network_interface) else { - return self; - }; - - responses.add(NodeGraphMessage::SetInput { - input_connector: InputConnector::node(node_id, 1), - input: NodeInput::value(TaggedValue::F64((start.x - end.x).abs()), false), - }); - responses.add(NodeGraphMessage::SetInput { - input_connector: InputConnector::node(node_id, 2), - input: NodeInput::value(TaggedValue::F64((start.y - end.y).abs()), false), - }); - responses.add(GraphOperationMessage::TransformSet { - layer, - transform: DAffine2::from_translation((start + end) / 2.), - transform_in: TransformIn::Viewport, - skip_rerender: false, - }); - } - } - - // Auto-panning - let messages = [ - RectangleToolMessage::PointerOutsideViewport { center, lock_ratio }.into(), - RectangleToolMessage::PointerMove { center, lock_ratio }.into(), - ]; - tool_data.auto_panning.setup_by_mouse_position(input, &messages, responses); - - self - } - (_, RectangleToolMessage::PointerMove { .. }) => { - shape_data.snap_manager.preview_draw(&SnapData::new(document, input), input.mouse.position); - responses.add(OverlaysMessage::Draw); - self - } - (RectangleToolFsmState::Drawing, RectangleToolMessage::PointerOutsideViewport { .. }) => { - // Auto-panning - let _ = tool_data.auto_panning.shift_viewport(input, responses); - - RectangleToolFsmState::Drawing - } - (state, RectangleToolMessage::PointerOutsideViewport { center, lock_ratio }) => { - // Auto-panning - let messages = [ - RectangleToolMessage::PointerOutsideViewport { center, lock_ratio }.into(), - RectangleToolMessage::PointerMove { center, lock_ratio }.into(), - ]; - tool_data.auto_panning.stop(&messages, responses); - - state - } - (RectangleToolFsmState::Drawing, RectangleToolMessage::DragStop) => { - input.mouse.finish_transaction(shape_data.viewport_drag_start(document), responses); - shape_data.cleanup(responses); - - RectangleToolFsmState::Ready - } - (RectangleToolFsmState::Drawing, RectangleToolMessage::Abort) => { - responses.add(DocumentMessage::AbortTransaction); - - shape_data.cleanup(responses); - - RectangleToolFsmState::Ready - } - (_, RectangleToolMessage::WorkingColorChanged) => { - responses.add(RectangleToolMessage::UpdateOptions(RectangleOptionsUpdate::WorkingColors( - Some(global_tool_data.primary_color), - Some(global_tool_data.secondary_color), - ))); - self - } - _ => self, - } - } - - fn update_hints(&self, responses: &mut VecDeque) { - let hint_data = match self { - RectangleToolFsmState::Ready => HintData(vec![HintGroup(vec![ - HintInfo::mouse(MouseMotion::LmbDrag, "Draw Rectangle"), - HintInfo::keys([Key::Shift], "Constrain Square").prepend_plus(), - HintInfo::keys([Key::Alt], "From Center").prepend_plus(), - ])]), - RectangleToolFsmState::Drawing => HintData(vec![ - HintGroup(vec![HintInfo::mouse(MouseMotion::Rmb, ""), HintInfo::keys([Key::Escape], "Cancel").prepend_slash()]), - HintGroup(vec![HintInfo::keys([Key::Shift], "Constrain Square"), HintInfo::keys([Key::Alt], "From Center")]), - ]), - }; - - responses.add(FrontendMessage::UpdateInputHints { hint_data }); - } - - fn update_cursor(&self, responses: &mut VecDeque) { - responses.add(FrontendMessage::UpdateMouseCursor { cursor: MouseCursorIcon::Crosshair }); - } -} diff --git a/editor/src/messages/tool/tool_messages/select_tool.rs b/editor/src/messages/tool/tool_messages/select_tool.rs index 3ce536cc50..d468c4dc75 100644 --- a/editor/src/messages/tool/tool_messages/select_tool.rs +++ b/editor/src/messages/tool/tool_messages/select_tool.rs @@ -1,10 +1,7 @@ #![allow(clippy::too_many_arguments)] use super::tool_prelude::*; -use crate::consts::{ - COLOR_OVERLAY_BLUE, COLOR_OVERLAY_GREEN, COLOR_OVERLAY_RED, COMPASS_ROSE_HOVER_RING_DIAMETER, DRAG_DIRECTION_MODE_DETERMINATION_THRESHOLD, RESIZE_HANDLE_SIZE, ROTATE_INCREMENT, - SELECTION_DRAG_ANGLE, SELECTION_TOLERANCE, -}; +use crate::consts::*; use crate::messages::input_mapper::utility_types::input_mouse::ViewportPosition; use crate::messages::portfolio::document::graph_operation::utility_types::TransformIn; use crate::messages::portfolio::document::overlays::utility_types::OverlayContext; @@ -12,7 +9,6 @@ use crate::messages::portfolio::document::utility_types::document_metadata::{Doc use crate::messages::portfolio::document::utility_types::misc::{AlignAggregate, AlignAxis, FlipAxis, GroupFolderType}; use crate::messages::portfolio::document::utility_types::network_interface::{FlowType, NodeNetworkInterface, NodeTemplate}; use crate::messages::portfolio::document::utility_types::nodes::SelectedNodes; -use crate::messages::portfolio::document::utility_types::transformation::Selected; use crate::messages::preferences::SelectionMode; use crate::messages::tool::common_functionality::auto_panning::AutoPanning; use crate::messages::tool::common_functionality::compass_rose::{Axis, CompassRose}; @@ -22,7 +18,7 @@ use crate::messages::tool::common_functionality::pivot::Pivot; use crate::messages::tool::common_functionality::shape_editor::SelectionShapeType; use crate::messages::tool::common_functionality::snapping::{self, SnapCandidatePoint, SnapData, SnapManager}; use crate::messages::tool::common_functionality::transformation_cage::*; -use crate::messages::tool::common_functionality::utility_functions::text_bounding_box; +use crate::messages::tool::common_functionality::utility_functions::{resize_bounds, rotate_bounds, skew_bounds, text_bounding_box, transforming_transform_cage}; use bezier_rs::Subpath; use glam::DMat2; use graph_craft::document::NodeId; @@ -861,35 +857,19 @@ impl Fsm for SelectToolFsmState { remove_from_selection, select_deepest, lasso_select, - skew, + .. }, ) => { tool_data.drag_start = input.mouse.position; tool_data.drag_current = input.mouse.position; tool_data.selection_mode = None; - let dragging_bounds = tool_data.bounding_box_manager.as_mut().and_then(|bounding_box| { - let edges = bounding_box.check_selected_edges(input.mouse.position); - - bounding_box.selected_edges = edges.map(|(top, bottom, left, right)| { - let selected_edges = SelectedEdges::new(top, bottom, left, right, bounding_box.bounds); - bounding_box.opposite_pivot = selected_edges.calculate_pivot(); - selected_edges - }); - - edges - }); - - let rotating_bounds = tool_data - .bounding_box_manager - .as_ref() - .map(|bounding_box| bounding_box.check_rotate(input.mouse.position)) - .unwrap_or_default(); - let mut selected: Vec<_> = document.network_interface.selected_nodes().selected_visible_and_unlocked_layers(&document.network_interface).collect(); let intersection_list = document.click_list(input).collect::>(); let intersection = document.find_deepest(&intersection_list); + let (resize, rotate, skew) = transforming_transform_cage(document, &mut tool_data.bounding_box_manager, input, responses, &mut tool_data.layers_dragging); + // If the user is dragging the bounding box bounds, go into ResizingBounds mode. // If the user is dragging the rotate trigger, go into RotatingBounds mode. // If the user clicks on a layer that is in their current selection, go into the dragging mode. @@ -907,15 +887,10 @@ impl Fsm for SelectToolFsmState { let show_compass = bounds.is_some_and(|quad| quad.all_sides_at_least_width(COMPASS_ROSE_HOVER_RING_DIAMETER) && quad.contains(mouse_position)); let can_grab_compass_rose = compass_rose_state.can_grab() && (show_compass || bounds.is_none()); - let is_flat_layer = tool_data - .bounding_box_manager - .as_ref() - .map(|bounding_box_manager| bounding_box_manager.transform_tampered) - .unwrap_or(true); - let state = + let state = if is_over_pivot // Dragging the pivot - if is_over_pivot { + { responses.add(DocumentMessage::StartTransaction); // tool_data.snap_manager.start_snap(document, input, document.bounding_boxes(), true, true); @@ -924,47 +899,12 @@ impl Fsm for SelectToolFsmState { SelectToolFsmState::DraggingPivot } // Dragging one (or two, forming a corner) of the transform cage bounding box edges - else if dragging_bounds.is_some() && !is_flat_layer { - responses.add(DocumentMessage::StartTransaction); - - tool_data.layers_dragging = selected; - - if let Some(bounds) = &mut tool_data.bounding_box_manager { - bounds.original_bound_transform = bounds.transform; - - tool_data.layers_dragging.retain(|layer| { - if *layer != LayerNodeIdentifier::ROOT_PARENT { - document.network_interface.document_network().nodes.contains_key(&layer.to_node()) - } else { - log::error!("ROOT_PARENT should not be part of layers_dragging"); - false - } - }); - - let mut selected = Selected::new( - &mut bounds.original_transforms, - &mut bounds.center_of_transformation, - &tool_data.layers_dragging, - responses, - &document.network_interface, - None, - &ToolType::Select, - None - ); - bounds.center_of_transformation = selected.mean_average_of_pivots(); - - // Check if we're hovering over a skew triangle - let edges = bounds.check_selected_edges(input.mouse.position); - if let Some(edges) = edges { - let closest_edge = bounds.get_closest_edge(edges, input.mouse.position); - if bounds.check_skew_handle(input.mouse.position, closest_edge) { - tool_data.get_snap_candidates(document, input); - return SelectToolFsmState::SkewingBounds { skew }; - } - } - } + else if resize { tool_data.get_snap_candidates(document, input); SelectToolFsmState::ResizingBounds + } else if skew { + tool_data.get_snap_candidates(document, input); + SelectToolFsmState::SkewingBounds { skew: Key::Control } } // Dragging the selected layers around to transform them else if can_grab_compass_rose || intersection.is_some_and(|intersection| selected.iter().any(|selected_layer| intersection.starts_with(*selected_layer, document.metadata()))) { @@ -983,37 +923,16 @@ impl Fsm for SelectToolFsmState { let axis_state = compass_rose_state.axis_type().filter(|_| can_grab_compass_rose); (axis_state.unwrap_or_default(), axis_state.is_some()) }; - SelectToolFsmState::Dragging { axis, using_compass, has_dragged: false, deepest: input.keyboard.key(select_deepest), remove: input.keyboard.key(extend_selection) } + SelectToolFsmState::Dragging { + axis, + using_compass, + has_dragged: false, + deepest: input.keyboard.key(select_deepest), + remove: input.keyboard.key(extend_selection), + } } // Dragging near the transform cage bounding box to rotate it - else if rotating_bounds { - responses.add(DocumentMessage::StartTransaction); - - if let Some(bounds) = &mut tool_data.bounding_box_manager { - tool_data.layers_dragging.retain(|layer| { - if *layer != LayerNodeIdentifier::ROOT_PARENT { - document.network_interface.document_network().nodes.contains_key(&layer.to_node()) - } else { - log::error!("ROOT_PARENT should not be part of layers_dragging"); - false - } - }); - let mut selected = Selected::new( - &mut bounds.original_transforms, - &mut bounds.center_of_transformation, - &selected, - responses, - &document.network_interface, - None, - &ToolType::Select, - None - ); - - bounds.center_of_transformation = selected.mean_average_of_pivots(); - } - - tool_data.layers_dragging = selected; - + else if rotate { SelectToolFsmState::RotatingBounds } // Dragging a selection box @@ -1036,7 +955,13 @@ impl Fsm for SelectToolFsmState { tool_data.get_snap_candidates(document, input); responses.add(DocumentMessage::StartTransaction); - SelectToolFsmState::Dragging { axis: Axis::None, using_compass: false, has_dragged: false, deepest: input.keyboard.key(select_deepest), remove: input.keyboard.key(extend_selection) } + SelectToolFsmState::Dragging { + axis: Axis::None, + using_compass: false, + has_dragged: false, + deepest: input.keyboard.key(select_deepest), + remove: input.keyboard.key(extend_selection), + } } else { let selection_shape = if input.keyboard.key(lasso_select) { SelectionShapeType::Lasso } else { SelectionShapeType::Box }; SelectToolFsmState::Drawing { selection_shape, has_drawn: false } @@ -1120,123 +1045,52 @@ impl Fsm for SelectToolFsmState { } (SelectToolFsmState::ResizingBounds, SelectToolMessage::PointerMove(modifier_keys)) => { if let Some(bounds) = &mut tool_data.bounding_box_manager { - if let Some(movement) = &mut bounds.selected_edges { - let (center, constrain) = (input.keyboard.key(modifier_keys.center), input.keyboard.key(modifier_keys.axis_align)); - - let center = center.then_some(bounds.center_of_transformation); - let snap = Some(SizeSnapData { - manager: &mut tool_data.snap_manager, - points: &mut tool_data.snap_candidates, - snap_data: SnapData::ignore(document, input, &tool_data.layers_dragging), - }); - let (position, size) = movement.new_size(input.mouse.position, bounds.original_bound_transform, center, constrain, snap); - let (delta, mut pivot) = movement.bounds_to_scale_transform(position, size); - - let pivot_transform = DAffine2::from_translation(pivot); - let transformation = pivot_transform * delta * pivot_transform.inverse(); - - tool_data.layers_dragging.retain(|layer| { - if *layer != LayerNodeIdentifier::ROOT_PARENT { - document.network_interface.document_network().nodes.contains_key(&layer.to_node()) - } else { - log::error!("ROOT_PARENT should not be part of layers_dragging"); - false - } - }); - let selected = &tool_data.layers_dragging; - let mut selected = Selected::new( - &mut bounds.original_transforms, - &mut pivot, - selected, - responses, - &document.network_interface, - None, - &ToolType::Select, - None, - ); - - selected.apply_transformation(bounds.original_bound_transform * transformation * bounds.original_bound_transform.inverse(), None); - - // Auto-panning - let messages = [ - SelectToolMessage::PointerOutsideViewport(modifier_keys.clone()).into(), - SelectToolMessage::PointerMove(modifier_keys).into(), - ]; - tool_data.auto_panning.setup_by_mouse_position(input, &messages, responses); - } + resize_bounds( + document, + responses, + bounds, + &mut tool_data.layers_dragging, + &mut tool_data.snap_manager, + &mut tool_data.snap_candidates, + input, + input.keyboard.key(modifier_keys.center), + input.keyboard.key(modifier_keys.axis_align), + ToolType::Select, + ); + let messages = [ + SelectToolMessage::PointerOutsideViewport(modifier_keys.clone()).into(), + SelectToolMessage::PointerMove(modifier_keys).into(), + ]; + tool_data.auto_panning.setup_by_mouse_position(input, &messages, responses); } SelectToolFsmState::ResizingBounds } (SelectToolFsmState::SkewingBounds { skew }, SelectToolMessage::PointerMove(_)) => { if let Some(bounds) = &mut tool_data.bounding_box_manager { - if let Some(movement) = &mut bounds.selected_edges { - let free_movement = input.keyboard.key(skew); - let transformation = movement.skew_transform(input.mouse.position, bounds.original_bound_transform, free_movement); - - tool_data.layers_dragging.retain(|layer| { - if *layer != LayerNodeIdentifier::ROOT_PARENT { - document.network_interface.document_network().nodes.contains_key(&layer.to_node()) - } else { - log::error!("ROOT_PARENT should not be part of layers_dragging"); - false - } - }); - let selected = &tool_data.layers_dragging; - let mut pivot = DVec2::ZERO; - let mut selected = Selected::new( - &mut bounds.original_transforms, - &mut pivot, - selected, - responses, - &document.network_interface, - None, - &ToolType::Select, - None, - ); - - selected.apply_transformation(bounds.original_bound_transform * transformation * bounds.original_bound_transform.inverse(), None); - } + skew_bounds( + document, + responses, + bounds, + input.keyboard.key(skew), + &mut tool_data.layers_dragging, + input.mouse.position, + ToolType::Select, + ); } SelectToolFsmState::SkewingBounds { skew } } - (SelectToolFsmState::RotatingBounds, SelectToolMessage::PointerMove(modifier_keys)) => { + (SelectToolFsmState::RotatingBounds, SelectToolMessage::PointerMove(_)) => { if let Some(bounds) = &mut tool_data.bounding_box_manager { - let angle = { - let start_offset = tool_data.drag_start - bounds.center_of_transformation; - let end_offset = input.mouse.position - bounds.center_of_transformation; - - start_offset.angle_to(end_offset) - }; - - let snapped_angle = if input.keyboard.key(modifier_keys.snap_angle) { - let snap_resolution = ROTATE_INCREMENT.to_radians(); - (angle / snap_resolution).round() * snap_resolution - } else { - angle - }; - - let delta = DAffine2::from_angle(snapped_angle); - - tool_data.layers_dragging.retain(|layer| { - if *layer != LayerNodeIdentifier::ROOT_PARENT { - document.network_interface.document_network().nodes.contains_key(&layer.to_node()) - } else { - log::error!("ROOT_PARENT should not be part of replacement_selected_layers"); - false - } - }); - let mut selected = Selected::new( - &mut bounds.original_transforms, - &mut bounds.center_of_transformation, - &tool_data.layers_dragging, + rotate_bounds( + document, responses, - &document.network_interface, - None, - &ToolType::Select, - None, + bounds, + &mut tool_data.layers_dragging, + tool_data.drag_start, + input.mouse.position, + input.keyboard.key(Key::Shift), + ToolType::Select, ); - - selected.update_transforms(delta, None, None); } SelectToolFsmState::RotatingBounds diff --git a/editor/src/messages/tool/tool_messages/shape_tool.rs b/editor/src/messages/tool/tool_messages/shape_tool.rs new file mode 100644 index 0000000000..a6b79a1139 --- /dev/null +++ b/editor/src/messages/tool/tool_messages/shape_tool.rs @@ -0,0 +1,966 @@ +use super::tool_prelude::*; +use crate::consts::{DEFAULT_STROKE_WIDTH, SNAP_POINT_TOLERANCE}; +use crate::messages::portfolio::document::graph_operation::utility_types::TransformIn; +use crate::messages::portfolio::document::overlays::utility_types::OverlayContext; +use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier; +use crate::messages::portfolio::document::utility_types::network_interface::InputConnector; +use crate::messages::tool::common_functionality::auto_panning::AutoPanning; +use crate::messages::tool::common_functionality::color_selector::{ToolColorOptions, ToolColorType}; +use crate::messages::tool::common_functionality::graph_modification_utils::{self, NodeGraphLayer}; +use crate::messages::tool::common_functionality::resize::Resize; +use crate::messages::tool::common_functionality::shape_gizmos::number_of_points_handle::{NumberOfPointsHandle, NumberOfPointsHandleState}; +use crate::messages::tool::common_functionality::shape_gizmos::point_radius_handle::{PointRadiusHandle, PointRadiusHandleState}; +use crate::messages::tool::common_functionality::shapes::line_shape::{LineToolData, clicked_on_line_endpoints}; +use crate::messages::tool::common_functionality::shapes::polygon_shape::Polygon; +use crate::messages::tool::common_functionality::shapes::shape_utility::{ShapeToolModifierKey, ShapeType, anchor_overlays, polygon_outline, star_outline, transform_cage_overlays}; +use crate::messages::tool::common_functionality::shapes::star_shape::Star; +use crate::messages::tool::common_functionality::shapes::{Ellipse, Line, Rectangle}; +use crate::messages::tool::common_functionality::snapping::{self, SnapCandidatePoint, SnapData, SnapTypeConfiguration}; +use crate::messages::tool::common_functionality::transformation_cage::{BoundingBoxManager, EdgeBool}; +use crate::messages::tool::common_functionality::utility_functions::{closest_point, resize_bounds, rotate_bounds, skew_bounds, transforming_transform_cage}; +use graph_craft::document::value::TaggedValue; +use graph_craft::document::{NodeId, NodeInput}; +use graphene_std::Color; +use graphene_std::renderer::Quad; + +#[derive(Default)] +pub struct ShapeTool { + fsm_state: ShapeToolFsmState, + tool_data: ShapeToolData, + options: ShapeToolOptions, +} + +pub struct ShapeToolOptions { + line_weight: f64, + fill: ToolColorOptions, + stroke: ToolColorOptions, + vertices: u32, + shape_type: ShapeType, +} + +impl Default for ShapeToolOptions { + fn default() -> Self { + Self { + line_weight: DEFAULT_STROKE_WIDTH, + fill: ToolColorOptions::new_secondary(), + stroke: ToolColorOptions::new_primary(), + shape_type: ShapeType::Polygon, + vertices: 5, + } + } +} + +#[derive(PartialEq, Clone, Debug, serde::Serialize, serde::Deserialize, specta::Type)] +pub enum ShapeOptionsUpdate { + FillColor(Option), + FillColorType(ToolColorType), + LineWeight(f64), + StrokeColor(Option), + StrokeColorType(ToolColorType), + WorkingColors(Option, Option), + Vertices(u32), + ShapeType(ShapeType), +} + +#[impl_message(Message, ToolMessage, Shape)] +#[derive(PartialEq, Clone, Debug, serde::Serialize, serde::Deserialize, specta::Type)] +pub enum ShapeToolMessage { + // Standard messages + Overlays(OverlayContext), + Abort, + WorkingColorChanged, + + // Tool-specific messages + DragStart, + DragStop, + HideShapeTypeWidget(bool), + PointerMove(ShapeToolModifierKey), + PointerOutsideViewport(ShapeToolModifierKey), + UpdateOptions(ShapeOptionsUpdate), + SetShape(ShapeType), + + IncreaseSides, + DecreaseSides, + + NudgeSelectedLayers { delta_x: f64, delta_y: f64, resize: Key, resize_opposite_corner: Key }, +} + +fn create_sides_widget(vertices: u32) -> WidgetHolder { + NumberInput::new(Some(vertices as f64)) + .label("Sides") + .int() + .min(3.) + .max(1000.) + .mode(NumberInputMode::Increment) + .on_update(|number_input: &NumberInput| ShapeToolMessage::UpdateOptions(ShapeOptionsUpdate::Vertices(number_input.value.unwrap() as u32)).into()) + .widget_holder() +} + +fn create_shape_option_widget(shape_type: ShapeType) -> WidgetHolder { + let entries = vec![vec![ + MenuListEntry::new("Polygon") + .label("Polygon") + .on_commit(move |_| ShapeToolMessage::UpdateOptions(ShapeOptionsUpdate::ShapeType(ShapeType::Polygon)).into()), + MenuListEntry::new("Star") + .label("Star") + .on_commit(move |_| ShapeToolMessage::UpdateOptions(ShapeOptionsUpdate::ShapeType(ShapeType::Star)).into()), + ]]; + DropdownInput::new(entries).selected_index(Some(shape_type as u32)).widget_holder() +} + +fn create_weight_widget(line_weight: f64) -> WidgetHolder { + NumberInput::new(Some(line_weight)) + .unit(" px") + .label("Weight") + .min(0.) + .max((1_u64 << f64::MANTISSA_DIGITS) as f64) + .on_update(|number_input: &NumberInput| ShapeToolMessage::UpdateOptions(ShapeOptionsUpdate::LineWeight(number_input.value.unwrap())).into()) + .widget_holder() +} + +impl LayoutHolder for ShapeTool { + fn layout(&self) -> Layout { + let mut widgets = vec![]; + + if !self.tool_data.hide_shape_option_widget { + widgets.push(create_shape_option_widget(self.options.shape_type)); + widgets.push(Separator::new(SeparatorType::Unrelated).widget_holder()); + + if self.options.shape_type == ShapeType::Polygon || self.options.shape_type == ShapeType::Star { + widgets.push(create_sides_widget(self.options.vertices)); + widgets.push(Separator::new(SeparatorType::Unrelated).widget_holder()); + } + } + + if self.options.shape_type != ShapeType::Line { + widgets.append(&mut self.options.fill.create_widgets( + "Fill", + true, + |_| ShapeToolMessage::UpdateOptions(ShapeOptionsUpdate::FillColor(None)).into(), + |color_type: ToolColorType| WidgetCallback::new(move |_| ShapeToolMessage::UpdateOptions(ShapeOptionsUpdate::FillColorType(color_type.clone())).into()), + |color: &ColorInput| ShapeToolMessage::UpdateOptions(ShapeOptionsUpdate::FillColor(color.value.as_solid())).into(), + )); + + widgets.push(Separator::new(SeparatorType::Unrelated).widget_holder()); + } + + widgets.append(&mut self.options.stroke.create_widgets( + "Stroke", + true, + |_| ShapeToolMessage::UpdateOptions(ShapeOptionsUpdate::StrokeColor(None)).into(), + |color_type: ToolColorType| WidgetCallback::new(move |_| ShapeToolMessage::UpdateOptions(ShapeOptionsUpdate::StrokeColorType(color_type.clone())).into()), + |color: &ColorInput| ShapeToolMessage::UpdateOptions(ShapeOptionsUpdate::StrokeColor(color.value.as_solid())).into(), + )); + widgets.push(Separator::new(SeparatorType::Unrelated).widget_holder()); + widgets.push(create_weight_widget(self.options.line_weight)); + + Layout::WidgetLayout(WidgetLayout::new(vec![LayoutGroup::Row { widgets }])) + } +} + +impl<'a> MessageHandler> for ShapeTool { + fn process_message(&mut self, message: ToolMessage, responses: &mut VecDeque, tool_data: &mut ToolActionHandlerData<'a>) { + let ToolMessage::Shape(ShapeToolMessage::UpdateOptions(action)) = message else { + self.fsm_state.process_event(message, &mut self.tool_data, tool_data, &self.options, responses, true); + return; + }; + match action { + ShapeOptionsUpdate::FillColor(color) => { + self.options.fill.custom_color = color; + self.options.fill.color_type = ToolColorType::Custom; + } + ShapeOptionsUpdate::FillColorType(color_type) => { + self.options.fill.color_type = color_type; + } + ShapeOptionsUpdate::LineWeight(line_weight) => { + self.options.line_weight = line_weight; + } + ShapeOptionsUpdate::StrokeColor(color) => { + self.options.stroke.custom_color = color; + self.options.stroke.color_type = ToolColorType::Custom; + } + ShapeOptionsUpdate::StrokeColorType(color_type) => { + self.options.stroke.color_type = color_type; + } + ShapeOptionsUpdate::WorkingColors(primary, secondary) => { + self.options.stroke.primary_working_color = primary; + self.options.stroke.secondary_working_color = secondary; + self.options.fill.primary_working_color = primary; + self.options.fill.secondary_working_color = secondary; + } + ShapeOptionsUpdate::ShapeType(shape) => { + self.options.shape_type = shape; + self.tool_data.current_shape = shape; + } + ShapeOptionsUpdate::Vertices(vertices) => { + self.options.vertices = vertices; + } + } + + self.fsm_state.update_hints(responses); + self.send_layout(responses, LayoutTarget::ToolOptions); + } + + fn actions(&self) -> ActionList { + match self.fsm_state { + ShapeToolFsmState::Ready(_) => actions!(ShapeToolMessageDiscriminant; + DragStart, + PointerMove, + SetShape, + Abort, + HideShapeTypeWidget, + IncreaseSides, + DecreaseSides, + NudgeSelectedLayers, + ), + ShapeToolFsmState::Drawing(_) + | ShapeToolFsmState::ResizingBounds + | ShapeToolFsmState::DraggingLineEndpoints + | ShapeToolFsmState::RotatingBounds + | ShapeToolFsmState::DraggingStarInnerRadius + | ShapeToolFsmState::DraggingStarNumberPointHandle + | ShapeToolFsmState::SkewingBounds { .. } => { + actions!(ShapeToolMessageDiscriminant; + DragStop, + Abort, + PointerMove, + SetShape, + HideShapeTypeWidget, + IncreaseSides, + DecreaseSides, + NudgeSelectedLayers, + ) + } + } + } +} + +impl ToolMetadata for ShapeTool { + fn icon_name(&self) -> String { + "VectorPolygonTool".into() + } + fn tooltip(&self) -> String { + "Shape Tool".into() + } + fn tool_type(&self) -> ToolType { + ToolType::Shape + } +} + +impl ToolTransition for ShapeTool { + fn event_to_message_map(&self) -> EventToMessageMap { + EventToMessageMap { + overlay_provider: Some(|overlay_context| ShapeToolMessage::Overlays(overlay_context).into()), + tool_abort: Some(ShapeToolMessage::Abort.into()), + working_color_changed: Some(ShapeToolMessage::WorkingColorChanged.into()), + ..Default::default() + } + } +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum ShapeToolFsmState { + Ready(ShapeType), + Drawing(ShapeType), + + // Line shape-specific + DraggingLineEndpoints, + + // Star shape-specific + DraggingStarInnerRadius, + DraggingStarNumberPointHandle, + + // Transform cage + ResizingBounds, + RotatingBounds, + SkewingBounds { skew: Key }, +} + +impl Default for ShapeToolFsmState { + fn default() -> Self { + ShapeToolFsmState::Ready(ShapeType::default()) + } +} + +#[derive(Clone, Debug, Default)] +pub struct ShapeToolData { + pub data: Resize, + auto_panning: AutoPanning, + + // In viewport space + pub last_mouse_position: DVec2, + + // Hide the dropdown menu when using Line, Rectangle, or Ellipse aliases + pub hide_shape_option_widget: bool, + + // Shape-specific data + pub line_data: LineToolData, + + // Used for by transform cage + pub bounding_box_manager: Option, + layers_dragging: Vec, + snap_candidates: Vec, + skew_edge: EdgeBool, + cursor: MouseCursorIcon, + + // Current shape which is being drawn + current_shape: ShapeType, + + // Gizmo data + pub point_radius_handle: PointRadiusHandle, + pub number_of_points_handle: NumberOfPointsHandle, +} + +impl ShapeToolData { + fn get_snap_candidates(&mut self, document: &DocumentMessageHandler, input: &InputPreprocessorMessageHandler) { + self.snap_candidates.clear(); + for &layer in &self.layers_dragging { + if (self.snap_candidates.len() as f64) < document.snapping_state.tolerance { + snapping::get_layer_snap_points(layer, &SnapData::new(document, input), &mut self.snap_candidates); + } + if let Some(bounds) = document.metadata().bounding_box_with_transform(layer, DAffine2::IDENTITY) { + let quad = document.metadata().transform_to_document(layer) * Quad::from_box(bounds); + snapping::get_bbox_points(quad, &mut self.snap_candidates, snapping::BBoxSnapValues::BOUNDING_BOX, document); + } + } + } + + fn outlines(&self, document: &DocumentMessageHandler, overlay_context: &mut OverlayContext) { + if let Some(layer) = self.number_of_points_handle.layer.or(self.point_radius_handle.layer) { + star_outline(layer, document, overlay_context); + polygon_outline(layer, document, overlay_context); + return; + } + + // Fallback: apply to all selected visible & unlocked star layers + for layer in document + .network_interface + .selected_nodes() + .selected_visible_and_unlocked_layers(&document.network_interface) + .filter(|layer| { + graph_modification_utils::get_star_id(*layer, &document.network_interface).is_some() || graph_modification_utils::get_polygon_id(*layer, &document.network_interface).is_some() + }) { + star_outline(layer, document, overlay_context); + polygon_outline(layer, document, overlay_context); + } + } +} + +impl Fsm for ShapeToolFsmState { + type ToolData = ShapeToolData; + type ToolOptions = ShapeToolOptions; + + fn transition( + self, + event: ToolMessage, + tool_data: &mut Self::ToolData, + ToolActionHandlerData { + document, + global_tool_data, + input, + preferences, + shape_editor, + .. + }: &mut ToolActionHandlerData, + tool_options: &Self::ToolOptions, + responses: &mut VecDeque, + ) -> Self { + let all_selected_layers_line = document + .network_interface + .selected_nodes() + .selected_visible_and_unlocked_layers(&document.network_interface) + .all(|layer| graph_modification_utils::get_line_id(layer, &document.network_interface).is_some()); + + let ToolMessage::Shape(event) = event else { return self }; + + match (self, event) { + (_, ShapeToolMessage::Overlays(mut overlay_context)) => { + let mouse_position = tool_data + .data + .snap_manager + .indicator_pos() + .map(|pos| document.metadata().document_to_viewport.transform_point2(pos)) + .unwrap_or(input.mouse.position); + let is_resizing_or_rotating = matches!(self, ShapeToolFsmState::ResizingBounds | ShapeToolFsmState::SkewingBounds { .. } | ShapeToolFsmState::RotatingBounds); + let dragging_start_gizmos = matches!(self, Self::DraggingStarInnerRadius); + + if matches!(self, ShapeToolFsmState::DraggingStarInnerRadius | Self::DraggingStarNumberPointHandle | Self::Ready(_)) && !input.keyboard.key(Key::Control) { + // Manage state handling of the number of point gizmos + tool_data.number_of_points_handle.handle_actions(document, input, mouse_position, &mut overlay_context, responses); + + // Manage state handling of point radius handle gizmo + tool_data.point_radius_handle.handle_actions(document, mouse_position); + + tool_data.number_of_points_handle.overlays(document, input, shape_editor, mouse_position, &mut overlay_context); + tool_data + .point_radius_handle + .overlays(tool_data.number_of_points_handle.layer.is_some(), document, input, mouse_position, &mut overlay_context); + tool_data.outlines(document, &mut overlay_context); + } + + let hovered = tool_data.number_of_points_handle.is_hovering() || tool_data.number_of_points_handle.is_dragging() || !tool_data.point_radius_handle.is_inactive(); + let modifying_transform_cage = matches!(self, ShapeToolFsmState::ResizingBounds | ShapeToolFsmState::RotatingBounds | ShapeToolFsmState::SkewingBounds { .. }); + + if !is_resizing_or_rotating && !dragging_start_gizmos && !hovered && !modifying_transform_cage { + tool_data.data.snap_manager.draw_overlays(SnapData::new(document, input), &mut overlay_context); + } + + if modifying_transform_cage { + transform_cage_overlays(document, tool_data, &mut overlay_context); + } + + if input.keyboard.key(Key::Control) && matches!(self, ShapeToolFsmState::Ready(_)) { + anchor_overlays(document, &mut overlay_context); + } else if matches!(self, ShapeToolFsmState::Ready(_)) { + Line::overlays(document, tool_data, &mut overlay_context); + + if all_selected_layers_line { + return self; + } + + transform_cage_overlays(document, tool_data, &mut overlay_context); + + let dragging_bounds = tool_data + .bounding_box_manager + .as_mut() + .and_then(|bounding_box| bounding_box.check_selected_edges(input.mouse.position)) + .is_some(); + + if let Some(bounds) = tool_data.bounding_box_manager.as_mut() { + let edges = bounds.check_selected_edges(input.mouse.position); + let is_skewing = matches!(self, ShapeToolFsmState::SkewingBounds { .. }); + let is_near_square = edges.is_some_and(|hover_edge| bounds.over_extended_edge_midpoint(input.mouse.position, hover_edge)); + if is_skewing || (dragging_bounds && is_near_square && !is_resizing_or_rotating) { + bounds.render_skew_gizmos(&mut overlay_context, tool_data.skew_edge); + } + if !is_skewing && dragging_bounds { + if let Some(edges) = edges { + tool_data.skew_edge = bounds.get_closest_edge(edges, input.mouse.position); + } + } + } + } + + if matches!(self, ShapeToolFsmState::Drawing(_) | ShapeToolFsmState::DraggingLineEndpoints) { + Line::overlays(document, tool_data, &mut overlay_context); + } + + self + } + (ShapeToolFsmState::Ready(_), ShapeToolMessage::IncreaseSides) => { + responses.add(ShapeToolMessage::UpdateOptions(ShapeOptionsUpdate::Vertices(tool_options.vertices + 1))); + self + } + (ShapeToolFsmState::Ready(_), ShapeToolMessage::DecreaseSides) => { + responses.add(ShapeToolMessage::UpdateOptions(ShapeOptionsUpdate::Vertices((tool_options.vertices - 1).max(3)))); + self + } + ( + ShapeToolFsmState::Ready(_), + ShapeToolMessage::NudgeSelectedLayers { + delta_x, + delta_y, + resize, + resize_opposite_corner, + }, + ) => { + responses.add(DocumentMessage::NudgeSelectedLayers { + delta_x, + delta_y, + resize, + resize_opposite_corner, + }); + + self + } + (ShapeToolFsmState::Drawing(_), ShapeToolMessage::NudgeSelectedLayers { .. }) => { + let increase = input.keyboard.key(Key::ArrowUp); + let decrease = input.keyboard.key(Key::ArrowDown); + + if increase { + responses.add(ShapeToolMessage::IncreaseSides); + return self; + } + + if decrease { + responses.add(ShapeToolMessage::DecreaseSides); + return self; + } + self + } + (ShapeToolFsmState::Drawing(_), ShapeToolMessage::IncreaseSides) => { + if let Some(layer) = tool_data.data.layer { + let Some(node_id) = graph_modification_utils::get_polygon_id(layer, &document.network_interface).or(graph_modification_utils::get_star_id(layer, &document.network_interface)) + else { + return self; + }; + + let Some(node_inputs) = NodeGraphLayer::new(layer, &document.network_interface) + .find_node_inputs("Regular Polygon") + .or(NodeGraphLayer::new(layer, &document.network_interface).find_node_inputs("Star")) + else { + return self; + }; + + let Some(&TaggedValue::U32(n)) = node_inputs.get(1).unwrap().as_value() else { + return self; + }; + + responses.add(ShapeToolMessage::UpdateOptions(ShapeOptionsUpdate::Vertices(n + 1))); + + responses.add(NodeGraphMessage::SetInput { + input_connector: InputConnector::node(node_id, 1), + input: NodeInput::value(TaggedValue::U32(n + 1), false), + }); + responses.add(NodeGraphMessage::RunDocumentGraph); + } + + self + } + (ShapeToolFsmState::Drawing(_), ShapeToolMessage::DecreaseSides) => { + if let Some(layer) = tool_data.data.layer { + let Some(node_id) = graph_modification_utils::get_polygon_id(layer, &document.network_interface).or(graph_modification_utils::get_star_id(layer, &document.network_interface)) + else { + return self; + }; + + let Some(node_inputs) = NodeGraphLayer::new(layer, &document.network_interface) + .find_node_inputs("Regular Polygon") + .or(NodeGraphLayer::new(layer, &document.network_interface).find_node_inputs("Star")) + else { + return self; + }; + + let Some(&TaggedValue::U32(n)) = node_inputs.get(1).unwrap().as_value() else { + return self; + }; + + responses.add(ShapeToolMessage::UpdateOptions(ShapeOptionsUpdate::Vertices((n - 1).max(3)))); + + responses.add(NodeGraphMessage::SetInput { + input_connector: InputConnector::node(node_id, 1), + input: NodeInput::value(TaggedValue::U32((n - 1).max(3)), false), + }); + responses.add(NodeGraphMessage::RunDocumentGraph); + } + + self + } + (ShapeToolFsmState::Ready(_), ShapeToolMessage::DragStart) => { + tool_data.line_data.drag_start = input.mouse.position; + + // Snapped position in viewport space + let mouse_pos = tool_data + .data + .snap_manager + .indicator_pos() + .map(|pos| document.metadata().document_to_viewport.transform_point2(pos)) + .unwrap_or(input.mouse.position); + + tool_data.line_data.drag_current = mouse_pos; + + // Check if dragging the inner vertices of a star + if tool_data.point_radius_handle.hovered() { + tool_data.last_mouse_position = mouse_pos; + tool_data.point_radius_handle.update_state(PointRadiusHandleState::Dragging); + + // Always store it in document space + tool_data.data.drag_start = document.metadata().document_to_viewport.inverse().transform_point2(mouse_pos); + + responses.add(DocumentMessage::StartTransaction); + return ShapeToolFsmState::DraggingStarInnerRadius; + } + + // Check if dragging the number of points handle of a star or polygon + if tool_data.number_of_points_handle.is_hovering() { + tool_data.last_mouse_position = mouse_pos; + tool_data.number_of_points_handle.update_state(NumberOfPointsHandleState::Dragging); + + // Always store it in document space + tool_data.data.drag_start = document.metadata().document_to_viewport.inverse().transform_point2(mouse_pos); + + responses.add(DocumentMessage::StartTransaction); + return ShapeToolFsmState::DraggingStarNumberPointHandle; + } + + // If clicked on endpoints of a selected line, drag its endpoints + if let Some((layer, _, _)) = closest_point( + document, + mouse_pos, + SNAP_POINT_TOLERANCE, + document.network_interface.selected_nodes().selected_visible_and_unlocked_layers(&document.network_interface), + |_| false, + preferences, + ) { + if clicked_on_line_endpoints(layer, document, input, tool_data) && !input.keyboard.key(Key::Control) { + return ShapeToolFsmState::DraggingLineEndpoints; + } + } + + let (resize, rotate, skew) = transforming_transform_cage(document, &mut tool_data.bounding_box_manager, input, responses, &mut tool_data.layers_dragging); + + if !input.keyboard.key(Key::Control) { + match (resize, rotate, skew) { + (true, false, false) => { + tool_data.get_snap_candidates(document, input); + return ShapeToolFsmState::ResizingBounds; + } + (false, true, false) => { + tool_data.data.drag_start = mouse_pos; + return ShapeToolFsmState::RotatingBounds; + } + (false, false, true) => { + tool_data.get_snap_candidates(document, input); + return ShapeToolFsmState::SkewingBounds { skew: Key::Control }; + } + _ => {} + } + }; + + match tool_data.current_shape { + ShapeType::Polygon | ShapeType::Star | ShapeType::Ellipse | ShapeType::Rectangle => tool_data.data.start(document, input), + ShapeType::Line => { + let point = SnapCandidatePoint::handle(document.metadata().document_to_viewport.inverse().transform_point2(input.mouse.position)); + let snapped = tool_data.data.snap_manager.free_snap(&SnapData::new(document, input), &point, SnapTypeConfiguration::default()); + tool_data.data.drag_start = snapped.snapped_point_document; + } + } + + responses.add(DocumentMessage::StartTransaction); + + let node = match tool_data.current_shape { + ShapeType::Polygon => Polygon::create_node(tool_options.vertices), + ShapeType::Star => Star::create_node(tool_options.vertices), + ShapeType::Rectangle => Rectangle::create_node(), + ShapeType::Ellipse => Ellipse::create_node(), + ShapeType::Line => Line::create_node(document, tool_data.data.drag_start), + }; + + let nodes = vec![(NodeId(0), node)]; + let layer = graph_modification_utils::new_custom(NodeId::new(), nodes, document.new_layer_bounding_artboard(input), responses); + + responses.add(Message::StartBuffer); + + match tool_data.current_shape { + ShapeType::Ellipse | ShapeType::Rectangle | ShapeType::Polygon | ShapeType::Star => { + responses.add(GraphOperationMessage::TransformSet { + layer, + transform: DAffine2::from_scale_angle_translation(DVec2::ONE, 0., input.mouse.position), + transform_in: TransformIn::Viewport, + skip_rerender: false, + }); + + tool_options.fill.apply_fill(layer, responses); + } + ShapeType::Line => { + tool_data.line_data.angle = 0.; + tool_data.line_data.weight = tool_options.line_weight; + tool_data.line_data.editing_layer = Some(layer); + } + } + tool_options.stroke.apply_stroke(tool_options.line_weight, layer, responses); + + tool_data.data.layer = Some(layer); + + ShapeToolFsmState::Drawing(tool_data.current_shape) + } + (ShapeToolFsmState::Drawing(shape), ShapeToolMessage::PointerMove(modifier)) => { + let Some(layer) = tool_data.data.layer else { + return ShapeToolFsmState::Ready(shape); + }; + + match tool_data.current_shape { + ShapeType::Rectangle => Rectangle::update_shape(document, input, layer, tool_data, modifier, responses), + ShapeType::Ellipse => Ellipse::update_shape(document, input, layer, tool_data, modifier, responses), + ShapeType::Line => Line::update_shape(document, input, layer, tool_data, modifier, responses), + ShapeType::Polygon => Polygon::update_shape(document, input, layer, tool_data, modifier, responses), + ShapeType::Star => Star::update_shape(document, input, layer, tool_data, modifier, responses), + } + + // Auto-panning + let messages = [ShapeToolMessage::PointerOutsideViewport(modifier).into(), ShapeToolMessage::PointerMove(modifier).into()]; + tool_data.auto_panning.setup_by_mouse_position(input, &messages, responses); + + self + } + (ShapeToolFsmState::DraggingLineEndpoints, ShapeToolMessage::PointerMove(modifier)) => { + let Some(layer) = tool_data.line_data.editing_layer else { + return ShapeToolFsmState::Ready(tool_data.current_shape); + }; + + Line::update_shape(document, input, layer, tool_data, modifier, responses); + // Auto-panning + let messages = [ShapeToolMessage::PointerOutsideViewport(modifier).into(), ShapeToolMessage::PointerMove(modifier).into()]; + tool_data.auto_panning.setup_by_mouse_position(input, &messages, responses); + + self + } + (ShapeToolFsmState::DraggingStarInnerRadius, ShapeToolMessage::PointerMove(..)) => { + if let Some(layer) = tool_data.point_radius_handle.layer { + tool_data.point_radius_handle.update_inner_radius(document, input, layer, responses, tool_data.data.drag_start); + tool_data.last_mouse_position = input.mouse.position; + } + + responses.add(OverlaysMessage::Draw); + + ShapeToolFsmState::DraggingStarInnerRadius + } + (ShapeToolFsmState::DraggingStarNumberPointHandle, ShapeToolMessage::PointerMove(..)) => { + tool_data.number_of_points_handle.update_number_of_sides(document, input, responses, tool_data.data.drag_start); + + tool_data.last_mouse_position = input.mouse.position; + responses.add(OverlaysMessage::Draw); + + ShapeToolFsmState::DraggingStarNumberPointHandle + } + (ShapeToolFsmState::ResizingBounds, ShapeToolMessage::PointerMove(modifier)) => { + if let Some(bounds) = &mut tool_data.bounding_box_manager { + let messages = [ShapeToolMessage::PointerOutsideViewport(modifier).into(), ShapeToolMessage::PointerMove(modifier).into()]; + resize_bounds( + document, + responses, + bounds, + &mut tool_data.layers_dragging, + &mut tool_data.data.snap_manager, + &mut tool_data.snap_candidates, + input, + input.keyboard.key(modifier[0]), + input.keyboard.key(modifier[1]), + ToolType::Shape, + ); + tool_data.auto_panning.setup_by_mouse_position(input, &messages, responses); + } + + responses.add(OverlaysMessage::Draw); + ShapeToolFsmState::ResizingBounds + } + (ShapeToolFsmState::RotatingBounds, ShapeToolMessage::PointerMove(modifier)) => { + if let Some(bounds) = &mut tool_data.bounding_box_manager { + rotate_bounds( + document, + responses, + bounds, + &mut tool_data.layers_dragging, + tool_data.data.drag_start, + input.mouse.position, + input.keyboard.key(modifier[1]), + ToolType::Shape, + ); + } + + ShapeToolFsmState::RotatingBounds + } + (ShapeToolFsmState::SkewingBounds { skew }, ShapeToolMessage::PointerMove(_)) => { + if let Some(bounds) = &mut tool_data.bounding_box_manager { + skew_bounds( + document, + responses, + bounds, + input.keyboard.key(skew), + &mut tool_data.layers_dragging, + input.mouse.position, + ToolType::Shape, + ); + } + + ShapeToolFsmState::SkewingBounds { skew } + } + + (_, ShapeToolMessage::PointerMove(_)) => { + let dragging_bounds = tool_data + .bounding_box_manager + .as_mut() + .and_then(|bounding_box| bounding_box.check_selected_edges(input.mouse.position)) + .is_some(); + + let cursor = tool_data + .bounding_box_manager + .as_ref() + .map_or(MouseCursorIcon::Default, |bounds| bounds.get_cursor(input, true, dragging_bounds, Some(tool_data.skew_edge))); + + if tool_data.cursor != cursor && !input.keyboard.key(Key::Control) && tool_data.point_radius_handle.is_inactive() && !all_selected_layers_line { + tool_data.cursor = cursor; + responses.add(FrontendMessage::UpdateMouseCursor { cursor }); + } + + tool_data.data.snap_manager.preview_draw(&SnapData::new(document, input), input.mouse.position); + + responses.add(OverlaysMessage::Draw); + self + } + (ShapeToolFsmState::ResizingBounds | ShapeToolFsmState::SkewingBounds { .. }, ShapeToolMessage::PointerOutsideViewport(_)) => { + // Auto-panning + if let Some(shift) = tool_data.auto_panning.shift_viewport(input, responses) { + if let Some(bounds) = &mut tool_data.bounding_box_manager { + bounds.center_of_transformation += shift; + bounds.original_bound_transform.translation += shift; + } + } + + self + } + (ShapeToolFsmState::Ready(_), ShapeToolMessage::PointerOutsideViewport(..)) => self, + (_, ShapeToolMessage::PointerOutsideViewport { .. }) => { + // Auto-panning + let _ = tool_data.auto_panning.shift_viewport(input, responses); + self + } + ( + ShapeToolFsmState::Drawing(_) + | ShapeToolFsmState::DraggingLineEndpoints + | ShapeToolFsmState::ResizingBounds + | ShapeToolFsmState::RotatingBounds + | ShapeToolFsmState::SkewingBounds { .. } + | ShapeToolFsmState::DraggingStarInnerRadius + | ShapeToolFsmState::DraggingStarNumberPointHandle, + ShapeToolMessage::DragStop, + ) => { + input.mouse.finish_transaction(tool_data.data.drag_start, responses); + tool_data.data.cleanup(responses); + + tool_data.number_of_points_handle.cleanup(); + tool_data.point_radius_handle.cleanup(); + + if let Some(bounds) = &mut tool_data.bounding_box_manager { + bounds.original_transforms.clear(); + } + + tool_data.line_data.dragging_endpoint = None; + + responses.add(FrontendMessage::UpdateMouseCursor { cursor: MouseCursorIcon::Crosshair }); + + ShapeToolFsmState::Ready(tool_data.current_shape) + } + ( + ShapeToolFsmState::Drawing(_) + | ShapeToolFsmState::DraggingLineEndpoints + | ShapeToolFsmState::ResizingBounds + | ShapeToolFsmState::RotatingBounds + | ShapeToolFsmState::SkewingBounds { .. } + | ShapeToolFsmState::DraggingStarInnerRadius + | ShapeToolFsmState::DraggingStarNumberPointHandle, + ShapeToolMessage::Abort, + ) => { + responses.add(DocumentMessage::AbortTransaction); + tool_data.data.cleanup(responses); + tool_data.line_data.dragging_endpoint = None; + + // Reset gizmo state + tool_data.number_of_points_handle.cleanup(); + tool_data.point_radius_handle.cleanup(); + + if let Some(bounds) = &mut tool_data.bounding_box_manager { + bounds.original_transforms.clear(); + } + + responses.add(FrontendMessage::UpdateMouseCursor { cursor: MouseCursorIcon::Crosshair }); + + ShapeToolFsmState::Ready(tool_data.current_shape) + } + (_, ShapeToolMessage::WorkingColorChanged) => { + responses.add(ShapeToolMessage::UpdateOptions(ShapeOptionsUpdate::WorkingColors( + Some(global_tool_data.primary_color), + Some(global_tool_data.secondary_color), + ))); + self + } + (_, ShapeToolMessage::SetShape(shape)) => { + responses.add(DocumentMessage::AbortTransaction); + tool_data.data.cleanup(responses); + tool_data.current_shape = shape; + + ShapeToolFsmState::Ready(shape) + } + (_, ShapeToolMessage::HideShapeTypeWidget(hide)) => { + tool_data.hide_shape_option_widget = hide; + responses.add(ToolMessage::RefreshToolOptions); + self + } + _ => self, + } + } + + fn update_hints(&self, responses: &mut VecDeque) { + let hint_data = match self { + ShapeToolFsmState::Ready(shape) => { + let hint_groups = match shape { + ShapeType::Polygon | ShapeType::Star => vec![ + HintGroup(vec![ + HintInfo::mouse(MouseMotion::LmbDrag, "Draw Polygon"), + HintInfo::keys([Key::Shift], "Constrain Regular").prepend_plus(), + HintInfo::keys([Key::Alt], "From Center").prepend_plus(), + ]), + HintGroup(vec![HintInfo::multi_keys([[Key::BracketLeft], [Key::BracketRight]], "Decrease/Increase Sides")]), + ], + ShapeType::Ellipse => vec![HintGroup(vec![ + HintInfo::mouse(MouseMotion::LmbDrag, "Draw Ellipse"), + HintInfo::keys([Key::Shift], "Constrain Circular").prepend_plus(), + HintInfo::keys([Key::Alt], "From Center").prepend_plus(), + ])], + ShapeType::Line => vec![HintGroup(vec![ + HintInfo::mouse(MouseMotion::LmbDrag, "Draw Line"), + HintInfo::keys([Key::Shift], "15° Increments").prepend_plus(), + HintInfo::keys([Key::Alt], "From Center").prepend_plus(), + HintInfo::keys([Key::Control], "Lock Angle").prepend_plus(), + ])], + ShapeType::Rectangle => vec![HintGroup(vec![ + HintInfo::mouse(MouseMotion::LmbDrag, "Draw Rectangle"), + HintInfo::keys([Key::Shift], "Constrain Square").prepend_plus(), + HintInfo::keys([Key::Alt], "From Center").prepend_plus(), + ])], + }; + HintData(hint_groups) + } + ShapeToolFsmState::Drawing(shape) => { + let mut common_hint_group = vec![HintGroup(vec![HintInfo::mouse(MouseMotion::Rmb, ""), HintInfo::keys([Key::Escape], "Cancel").prepend_slash()])]; + let tool_hint_group = match shape { + ShapeType::Polygon | ShapeType::Star => HintGroup(vec![HintInfo::keys([Key::Shift], "Constrain Regular"), HintInfo::keys([Key::Alt], "From Center")]), + ShapeType::Rectangle => HintGroup(vec![HintInfo::keys([Key::Shift], "Constrain Square"), HintInfo::keys([Key::Alt], "From Center")]), + ShapeType::Ellipse => HintGroup(vec![HintInfo::keys([Key::Shift], "Constrain Circular"), HintInfo::keys([Key::Alt], "From Center")]), + ShapeType::Line => HintGroup(vec![ + HintInfo::keys([Key::Shift], "15° Increments"), + HintInfo::keys([Key::Alt], "From Center"), + HintInfo::keys([Key::Control], "Lock Angle"), + ]), + }; + + common_hint_group.push(tool_hint_group); + + if matches!(shape, ShapeType::Polygon | ShapeType::Star) { + common_hint_group.push(HintGroup(vec![HintInfo::multi_keys([[Key::BracketLeft], [Key::BracketRight]], "Decrease/Increase Sides")])); + } + + HintData(common_hint_group) + } + ShapeToolFsmState::DraggingLineEndpoints => HintData(vec![ + HintGroup(vec![HintInfo::mouse(MouseMotion::Rmb, ""), HintInfo::keys([Key::Escape], "Cancel").prepend_slash()]), + HintGroup(vec![ + HintInfo::keys([Key::Shift], "15° Increments"), + HintInfo::keys([Key::Alt], "From Center"), + HintInfo::keys([Key::Control], "Lock Angle"), + ]), + ]), + ShapeToolFsmState::ResizingBounds => HintData(vec![ + HintGroup(vec![HintInfo::mouse(MouseMotion::Rmb, ""), HintInfo::keys([Key::Escape], "Cancel").prepend_slash()]), + HintGroup(vec![HintInfo::keys([Key::Alt], "From Pivot"), HintInfo::keys([Key::Shift], "Preserve Aspect Ratio")]), + ]), + ShapeToolFsmState::RotatingBounds => HintData(vec![ + HintGroup(vec![HintInfo::mouse(MouseMotion::Rmb, ""), HintInfo::keys([Key::Escape], "Cancel").prepend_slash()]), + HintGroup(vec![HintInfo::keys([Key::Shift], "15° Increments")]), + ]), + ShapeToolFsmState::SkewingBounds { .. } => HintData(vec![ + HintGroup(vec![HintInfo::mouse(MouseMotion::Rmb, ""), HintInfo::keys([Key::Escape], "Cancel").prepend_slash()]), + HintGroup(vec![HintInfo::keys([Key::Control], "Unlock Slide")]), + ]), + ShapeToolFsmState::DraggingStarInnerRadius | ShapeToolFsmState::DraggingStarNumberPointHandle => { + HintData(vec![HintGroup(vec![HintInfo::mouse(MouseMotion::Rmb, ""), HintInfo::keys([Key::Escape], "Cancel").prepend_slash()])]) + } + }; + + responses.add(FrontendMessage::UpdateInputHints { hint_data }); + } + + fn update_cursor(&self, responses: &mut VecDeque) { + responses.add(FrontendMessage::UpdateMouseCursor { cursor: MouseCursorIcon::Crosshair }); + } +} diff --git a/editor/src/messages/tool/transform_layer/transform_layer_message_handler.rs b/editor/src/messages/tool/transform_layer/transform_layer_message_handler.rs index 5797d3a136..eab68b8866 100644 --- a/editor/src/messages/tool/transform_layer/transform_layer_message_handler.rs +++ b/editor/src/messages/tool/transform_layer/transform_layer_message_handler.rs @@ -139,6 +139,7 @@ impl MessageHandler> for TransformLayer let using_path_tool = tool_data.active_tool_type == ToolType::Path; let using_select_tool = tool_data.active_tool_type == ToolType::Select; let using_pen_tool = tool_data.active_tool_type == ToolType::Pen; + let using_shape_tool = tool_data.active_tool_type == ToolType::Shape; // TODO: Add support for transforming layer not in the document network let selected_layers = document @@ -390,7 +391,7 @@ impl MessageHandler> for TransformLayer TransformLayerMessage::BeginGRS { transform_type } => { let selected_points: Vec<&ManipulatorPointId> = shape_editor.selected_points().collect(); if (using_path_tool && selected_points.is_empty()) - || (!using_path_tool && !using_select_tool && !using_pen_tool) + || (!using_path_tool && !using_select_tool && !using_pen_tool && !using_shape_tool) || selected_layers.is_empty() || transform_type.equivalent_to(self.transform_operation) { @@ -715,7 +716,8 @@ impl MessageHandler> for TransformLayer #[cfg(test)] mod test_transform_layer { - use crate::messages::portfolio::document::graph_operation::{transform_utils, utility_types::ModifyInputsContext}; + use crate::messages::portfolio::document::graph_operation::transform_utils; + use crate::messages::portfolio::document::graph_operation::utility_types::ModifyInputsContext; use crate::messages::portfolio::document::utility_types::misc::GroupFolderType; use crate::messages::prelude::Message; use crate::messages::tool::transform_layer::transform_layer_message_handler::VectorModificationType; diff --git a/editor/src/messages/tool/utility_types.rs b/editor/src/messages/tool/utility_types.rs index 42c9bd5427..f2b441331e 100644 --- a/editor/src/messages/tool/utility_types.rs +++ b/editor/src/messages/tool/utility_types.rs @@ -11,6 +11,7 @@ use crate::messages::layout::utility_types::widget_prelude::*; use crate::messages::portfolio::document::overlays::utility_types::OverlayProvider; use crate::messages::preferences::PreferencesMessageHandler; use crate::messages::prelude::*; +use crate::messages::tool::common_functionality::shapes::shape_utility::ShapeType; use crate::node_graph_executor::NodeGraphExecutor; use graphene_std::raster::color::Color; use graphene_std::text::FontCache; @@ -162,7 +163,7 @@ pub trait ToolTransition { on: event, send: Box::new(mapping.into()), }); - }; + } }; let event_to_tool_map = self.event_to_message_map(); @@ -182,7 +183,7 @@ pub trait ToolTransition { on: event, message: Box::new(mapping.into()), }); - }; + } }; let event_to_tool_map = self.event_to_message_map(); @@ -204,6 +205,7 @@ pub trait ToolMetadata { pub struct ToolData { pub active_tool_type: ToolType, + pub active_shape_type: Option, pub tools: HashMap>, } @@ -225,32 +227,51 @@ impl ToolData { impl LayoutHolder for ToolData { fn layout(&self) -> Layout { + let active_tool = self.active_shape_type.unwrap_or(self.active_tool_type); + let tool_groups_layout = list_tools_in_groups() .iter() - .map(|tool_group| tool_group.iter().map(|tool_availability| { - match tool_availability { - ToolAvailability::Available(tool) => ToolEntry::new(tool.tool_type(), tool.icon_name()) - .tooltip(tool.tooltip()) - .tooltip_shortcut(action_keys!(tool_type_to_activate_tool_message(tool.tool_type()))), - ToolAvailability::ComingSoon(tool) => tool.clone(), - } - }) - .collect::>()) + .map(|tool_group| + tool_group + .iter() + .map(|tool_availability| { + match tool_availability { + ToolAvailability::Available(tool) => + ToolEntry::new(tool.tool_type(), tool.icon_name()) + .tooltip(tool.tooltip()) + .tooltip_shortcut(action_keys!(tool_type_to_activate_tool_message(tool.tool_type()))), + ToolAvailability::AvailableAsShape(shape) => + ToolEntry::new(shape.tool_type(), shape.icon_name()) + .tooltip(shape.tooltip()) + .tooltip_shortcut(action_keys!(tool_type_to_activate_tool_message(shape.tool_type()))), + ToolAvailability::ComingSoon(tool) => tool.clone(), + } + }) + .collect::>() + ) .flat_map(|group| { let separator = std::iter::once(Separator::new(SeparatorType::Section).direction(SeparatorDirection::Vertical).widget_holder()); let buttons = group.into_iter().map(|ToolEntry { tooltip, tooltip_shortcut, tool_type, icon_name }| { IconButton::new(icon_name, 32) .disabled(false) - .active(self.active_tool_type == tool_type) + .active(match tool_type { + ToolType::Line | ToolType::Ellipse | ToolType::Rectangle => { self.active_shape_type.is_some() && active_tool == tool_type } + _ => active_tool == tool_type, + }) .tooltip(tooltip.clone()) .tooltip_shortcut(tooltip_shortcut) .on_update(move |_| { - if !tooltip.contains("Coming Soon") { - ToolMessage::ActivateTool { tool_type }.into() - } else { - DialogMessage::RequestComingSoonDialog { issue: None }.into() + match tool_type { + ToolType::Line => ToolMessage::ActivateToolShapeLine.into(), + ToolType::Rectangle => ToolMessage::ActivateToolShapeRectangle.into(), + ToolType::Ellipse => ToolMessage::ActivateToolShapeEllipse.into(), + ToolType::Shape => ToolMessage::ActivateToolShape.into(), + _ => { + if !tooltip.contains("Coming Soon") { (ToolMessage::ActivateTool { tool_type }).into() } else { (DialogMessage::RequestComingSoonDialog { issue: None }).into() } + } } - }).widget_holder() + }) + .widget_holder() }); separator.chain(buttons) @@ -287,11 +308,13 @@ impl Default for ToolFsmState { Self { tool_data: ToolData { active_tool_type: ToolType::Select, + active_shape_type: None, tools: list_tools_in_groups() .into_iter() .flatten() .filter_map(|tool| match tool { ToolAvailability::Available(tool) => Some((tool.tool_type(), tool)), + ToolAvailability::AvailableAsShape(_) => None, ToolAvailability::ComingSoon(_) => None, }) .collect(), @@ -327,10 +350,10 @@ pub enum ToolType { Pen, Freehand, Spline, - Line, - Rectangle, - Ellipse, - Polygon, + Shape, + Line, // Shape tool alias + Rectangle, // Shape tool alias + Ellipse, // Shape tool alias Text, // Raster tool group @@ -344,8 +367,22 @@ pub enum ToolType { Frame, } +impl ToolType { + pub fn get_shape(&self) -> Option { + match self { + Self::Rectangle | Self::Line | Self::Ellipse => Some(*self), + _ => None, + } + } + + pub fn get_tool(self) -> Self { + if self.get_shape().is_some() { ToolType::Shape } else { self } + } +} + enum ToolAvailability { Available(Box), + AvailableAsShape(ShapeType), ComingSoon(ToolEntry), } @@ -367,10 +404,10 @@ fn list_tools_in_groups() -> Vec> { ToolAvailability::Available(Box::::default()), ToolAvailability::Available(Box::::default()), ToolAvailability::Available(Box::::default()), - ToolAvailability::Available(Box::::default()), - ToolAvailability::Available(Box::::default()), - ToolAvailability::Available(Box::::default()), - ToolAvailability::Available(Box::::default()), + ToolAvailability::AvailableAsShape(ShapeType::Line), + ToolAvailability::AvailableAsShape(ShapeType::Rectangle), + ToolAvailability::AvailableAsShape(ShapeType::Ellipse), + ToolAvailability::Available(Box::::default()), ToolAvailability::Available(Box::::default()), ], vec![ @@ -403,10 +440,7 @@ pub fn tool_message_to_tool_type(tool_message: &ToolMessage) -> ToolType { ToolMessage::Pen(_) => ToolType::Pen, ToolMessage::Freehand(_) => ToolType::Freehand, ToolMessage::Spline(_) => ToolType::Spline, - ToolMessage::Line(_) => ToolType::Line, - ToolMessage::Rectangle(_) => ToolType::Rectangle, - ToolMessage::Ellipse(_) => ToolType::Ellipse, - ToolMessage::Polygon(_) => ToolType::Polygon, + ToolMessage::Shape(_) => ToolType::Shape, // Includes the Line, Rectangle, and Ellipse aliases ToolMessage::Text(_) => ToolType::Text, // Raster tool group @@ -436,10 +470,10 @@ pub fn tool_type_to_activate_tool_message(tool_type: ToolType) -> ToolMessageDis ToolType::Pen => ToolMessageDiscriminant::ActivateToolPen, ToolType::Freehand => ToolMessageDiscriminant::ActivateToolFreehand, ToolType::Spline => ToolMessageDiscriminant::ActivateToolSpline, - ToolType::Line => ToolMessageDiscriminant::ActivateToolLine, - ToolType::Rectangle => ToolMessageDiscriminant::ActivateToolRectangle, - ToolType::Ellipse => ToolMessageDiscriminant::ActivateToolEllipse, - ToolType::Polygon => ToolMessageDiscriminant::ActivateToolPolygon, + ToolType::Line => ToolMessageDiscriminant::ActivateToolShapeLine, // Shape tool alias + ToolType::Rectangle => ToolMessageDiscriminant::ActivateToolShapeRectangle, // Shape tool alias + ToolType::Ellipse => ToolMessageDiscriminant::ActivateToolShapeEllipse, // Shape tool alias + ToolType::Shape => ToolMessageDiscriminant::ActivateToolShape, ToolType::Text => ToolMessageDiscriminant::ActivateToolText, // Raster tool group diff --git a/editor/src/test_utils.rs b/editor/src/test_utils.rs index aaa7e3416f..683315c767 100644 --- a/editor/src/test_utils.rs +++ b/editor/src/test_utils.rs @@ -89,7 +89,7 @@ impl EditorTestUtils { } pub async fn draw_polygon(&mut self, x1: f64, y1: f64, x2: f64, y2: f64) { - self.drag_tool(ToolType::Polygon, x1, y1, x2, y2, ModifierKeys::default()).await; + self.drag_tool(ToolType::Shape, x1, y1, x2, y2, ModifierKeys::default()).await; } pub async fn draw_ellipse(&mut self, x1: f64, y1: f64, x2: f64, y2: f64) { @@ -218,7 +218,12 @@ impl EditorTestUtils { } pub async fn select_tool(&mut self, tool_type: ToolType) { - self.handle_message(Message::Tool(ToolMessage::ActivateTool { tool_type })).await; + match tool_type { + ToolType::Line => self.handle_message(Message::Tool(ToolMessage::ActivateToolShapeLine)).await, + ToolType::Rectangle => self.handle_message(Message::Tool(ToolMessage::ActivateToolShapeRectangle)).await, + ToolType::Ellipse => self.handle_message(Message::Tool(ToolMessage::ActivateToolShapeEllipse)).await, + _ => self.handle_message(Message::Tool(ToolMessage::ActivateTool { tool_type })).await, + } } pub async fn select_primary_color(&mut self, color: Color) { From 4344f28909dfe08b0a3c33f166e5cfca264bb60a Mon Sep 17 00:00:00 2001 From: James Lindsay <78500760+0HyperCube@users.noreply.github.com> Date: Sun, 22 Jun 2025 11:10:25 +0100 Subject: [PATCH 06/44] Reduce development environment warnings and remove DWARF debug symbols (#2741) * Ignore tauri gen * Deny warnings on CI * Fix all warnings in current nightly rustc * Disable DWARF debug info for development builds * Fix typo --------- Co-authored-by: Keavon Chambers --- .github/workflows/build-dev-and-ci.yml | 2 + .../portfolio/document/document_message.rs | 4 +- .../document/overlays/overlays_message.rs | 15 +- .../utility_types/document_metadata.rs | 10 +- .../transformation_cage.rs | 12 +- frontend/src-tauri/.gitignore | 2 + .../src-tauri/gen/schemas/acl-manifests.json | 1 - .../src-tauri/gen/schemas/capabilities.json | 1 - .../src-tauri/gen/schemas/desktop-schema.json | 2660 ----------------- .../src-tauri/gen/schemas/linux-schema.json | 2614 ---------------- .../src-tauri/gen/schemas/windows-schema.json | 2660 ----------------- frontend/wasm/Cargo.toml | 2 +- libraries/bezier-rs/src/subpath/core.rs | 4 +- node-graph/gcore/src/instances.rs | 12 +- node-graph/gcore/src/memo.rs | 2 +- node-graph/gcore/src/text/to_path.rs | 2 +- .../src/vector/vector_data/attributes.rs | 2 +- node-graph/gcore/src/vector/vector_nodes.rs | 6 +- node-graph/graph-craft/src/document.rs | 4 +- .../graph-craft/src/graphene_compiler.rs | 2 +- .../src/dynamic_executor.rs | 2 +- website/other/bezier-rs-demos/wasm/Cargo.toml | 2 +- 22 files changed, 53 insertions(+), 7968 deletions(-) delete mode 100644 frontend/src-tauri/gen/schemas/acl-manifests.json delete mode 100644 frontend/src-tauri/gen/schemas/capabilities.json delete mode 100644 frontend/src-tauri/gen/schemas/desktop-schema.json delete mode 100644 frontend/src-tauri/gen/schemas/linux-schema.json delete mode 100644 frontend/src-tauri/gen/schemas/windows-schema.json diff --git a/.github/workflows/build-dev-and-ci.yml b/.github/workflows/build-dev-and-ci.yml index 4e443817ce..77fd22d2a9 100644 --- a/.github/workflows/build-dev-and-ci.yml +++ b/.github/workflows/build-dev-and-ci.yml @@ -84,6 +84,8 @@ jobs: mold -run cargo fmt --all -- --check - name: 🦀 Build Rust code + env: + RUSTFLAGS: -Dwarnings run: | mold -run cargo build --all-features diff --git a/editor/src/messages/portfolio/document/document_message.rs b/editor/src/messages/portfolio/document/document_message.rs index 67ec690a4c..9ceec6b6c2 100644 --- a/editor/src/messages/portfolio/document/document_message.rs +++ b/editor/src/messages/portfolio/document/document_message.rs @@ -16,7 +16,8 @@ use graphene_std::transform::Footprint; use graphene_std::vector::style::ViewMode; #[impl_message(Message, PortfolioMessage, Document)] -#[derive(PartialEq, Clone, Debug, serde::Serialize, serde::Deserialize)] +#[derive(derivative::Derivative, Clone, serde::Serialize, serde::Deserialize)] +#[derivative(Debug, PartialEq)] pub enum DocumentMessage { Noop, // Sub-messages @@ -157,6 +158,7 @@ pub enum DocumentMessage { }, SetSnapping { #[serde(skip)] + #[derivative(Debug = "ignore", PartialEq = "ignore")] closure: Option fn(&'a mut SnappingState) -> &'a mut bool>, snapping_state: bool, }, diff --git a/editor/src/messages/portfolio/document/overlays/overlays_message.rs b/editor/src/messages/portfolio/document/overlays/overlays_message.rs index 5f075509ea..5ab1e7773c 100644 --- a/editor/src/messages/portfolio/document/overlays/overlays_message.rs +++ b/editor/src/messages/portfolio/document/overlays/overlays_message.rs @@ -2,10 +2,19 @@ use super::utility_types::{OverlayProvider, empty_provider}; use crate::messages::prelude::*; #[impl_message(Message, DocumentMessage, Overlays)] -#[derive(PartialEq, Clone, Debug, serde::Serialize, serde::Deserialize)] +#[derive(derivative::Derivative, Clone, serde::Serialize, serde::Deserialize)] +#[derivative(Debug, PartialEq)] pub enum OverlaysMessage { Draw, // Serde functionality isn't used but is required by the message system macros - AddProvider(#[serde(skip, default = "empty_provider")] OverlayProvider), - RemoveProvider(#[serde(skip, default = "empty_provider")] OverlayProvider), + AddProvider( + #[serde(skip, default = "empty_provider")] + #[derivative(Debug = "ignore", PartialEq = "ignore")] + OverlayProvider, + ), + RemoveProvider( + #[serde(skip, default = "empty_provider")] + #[derivative(Debug = "ignore", PartialEq = "ignore")] + OverlayProvider, + ), } diff --git a/editor/src/messages/portfolio/document/utility_types/document_metadata.rs b/editor/src/messages/portfolio/document/utility_types/document_metadata.rs index 43c6747905..8eb3defc84 100644 --- a/editor/src/messages/portfolio/document/utility_types/document_metadata.rs +++ b/editor/src/messages/portfolio/document/utility_types/document_metadata.rs @@ -294,7 +294,7 @@ impl LayerNodeIdentifier { } /// Iterator over all direct children (excluding self and recursive children) - pub fn children(self, metadata: &DocumentMetadata) -> AxisIter { + pub fn children(self, metadata: &DocumentMetadata) -> AxisIter<'_> { AxisIter { layer_node: self.first_child(metadata), next_node: Self::next_sibling, @@ -302,7 +302,7 @@ impl LayerNodeIdentifier { } } - pub fn downstream_siblings(self, metadata: &DocumentMetadata) -> AxisIter { + pub fn downstream_siblings(self, metadata: &DocumentMetadata) -> AxisIter<'_> { AxisIter { layer_node: Some(self), next_node: Self::previous_sibling, @@ -311,7 +311,7 @@ impl LayerNodeIdentifier { } /// All ancestors of this layer, including self, going to the document root - pub fn ancestors(self, metadata: &DocumentMetadata) -> AxisIter { + pub fn ancestors(self, metadata: &DocumentMetadata) -> AxisIter<'_> { AxisIter { layer_node: Some(self), next_node: Self::parent, @@ -320,7 +320,7 @@ impl LayerNodeIdentifier { } /// Iterator through all the last children, starting from self - pub fn last_children(self, metadata: &DocumentMetadata) -> AxisIter { + pub fn last_children(self, metadata: &DocumentMetadata) -> AxisIter<'_> { AxisIter { layer_node: Some(self), next_node: Self::last_child, @@ -329,7 +329,7 @@ impl LayerNodeIdentifier { } /// Iterator through all descendants, including recursive children (not including self) - pub fn descendants(self, metadata: &DocumentMetadata) -> DescendantsIter { + pub fn descendants(self, metadata: &DocumentMetadata) -> DescendantsIter<'_> { DescendantsIter { front: self.first_child(metadata), back: self.last_child(metadata).and_then(|child| child.last_children(metadata).last()), diff --git a/editor/src/messages/tool/common_functionality/transformation_cage.rs b/editor/src/messages/tool/common_functionality/transformation_cage.rs index cab20fb2a8..cb5ce0e91f 100644 --- a/editor/src/messages/tool/common_functionality/transformation_cage.rs +++ b/editor/src/messages/tool/common_functionality/transformation_cage.rs @@ -578,7 +578,9 @@ impl BoundingBoxManager { category, TransformCageSizeCategory::Full | TransformCageSizeCategory::Narrow | TransformCageSizeCategory::ReducedLandscape ) { - horizontal_edges.map(|point| draw_handle(point, horizontal_angle)); + for point in horizontal_edges { + draw_handle(point, horizontal_angle); + } } // Draw the vertical midpoint drag handles @@ -586,7 +588,9 @@ impl BoundingBoxManager { category, TransformCageSizeCategory::Full | TransformCageSizeCategory::Narrow | TransformCageSizeCategory::ReducedPortrait ) { - vertical_edges.map(|point| draw_handle(point, vertical_angle)); + for point in vertical_edges { + draw_handle(point, vertical_angle); + } } let angle = quad @@ -601,7 +605,9 @@ impl BoundingBoxManager { category, TransformCageSizeCategory::Full | TransformCageSizeCategory::ReducedBoth | TransformCageSizeCategory::ReducedLandscape | TransformCageSizeCategory::ReducedPortrait ) { - quad.0.map(|point| draw_handle(point, angle)); + for point in quad.0 { + draw_handle(point, angle); + } } // Draw the flat line endpoint drag handles diff --git a/frontend/src-tauri/.gitignore b/frontend/src-tauri/.gitignore index aba21e242c..3419525157 100644 --- a/frontend/src-tauri/.gitignore +++ b/frontend/src-tauri/.gitignore @@ -1,3 +1,5 @@ # Generated by Cargo # will have compiled files and executables /target/ +# Generated by tauri +gen/ diff --git a/frontend/src-tauri/gen/schemas/acl-manifests.json b/frontend/src-tauri/gen/schemas/acl-manifests.json deleted file mode 100644 index 370fc5f3af..0000000000 --- a/frontend/src-tauri/gen/schemas/acl-manifests.json +++ /dev/null @@ -1 +0,0 @@ -{"core":{"default_permission":{"identifier":"default","description":"Default core plugins set.","permissions":["core:path:default","core:event:default","core:window:default","core:webview:default","core:app:default","core:image:default","core:resources:default","core:menu:default","core:tray:default"]},"permissions":{},"permission_sets":{},"global_scope_schema":null},"core:app":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-version","allow-name","allow-tauri-version","allow-identifier"]},"permissions":{"allow-app-hide":{"identifier":"allow-app-hide","description":"Enables the app_hide command without any pre-configured scope.","commands":{"allow":["app_hide"],"deny":[]}},"allow-app-show":{"identifier":"allow-app-show","description":"Enables the app_show command without any pre-configured scope.","commands":{"allow":["app_show"],"deny":[]}},"allow-default-window-icon":{"identifier":"allow-default-window-icon","description":"Enables the default_window_icon command without any pre-configured scope.","commands":{"allow":["default_window_icon"],"deny":[]}},"allow-fetch-data-store-identifiers":{"identifier":"allow-fetch-data-store-identifiers","description":"Enables the fetch_data_store_identifiers command without any pre-configured scope.","commands":{"allow":["fetch_data_store_identifiers"],"deny":[]}},"allow-identifier":{"identifier":"allow-identifier","description":"Enables the identifier command without any pre-configured scope.","commands":{"allow":["identifier"],"deny":[]}},"allow-name":{"identifier":"allow-name","description":"Enables the name command without any pre-configured scope.","commands":{"allow":["name"],"deny":[]}},"allow-remove-data-store":{"identifier":"allow-remove-data-store","description":"Enables the remove_data_store command without any pre-configured scope.","commands":{"allow":["remove_data_store"],"deny":[]}},"allow-set-app-theme":{"identifier":"allow-set-app-theme","description":"Enables the set_app_theme command without any pre-configured scope.","commands":{"allow":["set_app_theme"],"deny":[]}},"allow-tauri-version":{"identifier":"allow-tauri-version","description":"Enables the tauri_version command without any pre-configured scope.","commands":{"allow":["tauri_version"],"deny":[]}},"allow-version":{"identifier":"allow-version","description":"Enables the version command without any pre-configured scope.","commands":{"allow":["version"],"deny":[]}},"deny-app-hide":{"identifier":"deny-app-hide","description":"Denies the app_hide command without any pre-configured scope.","commands":{"allow":[],"deny":["app_hide"]}},"deny-app-show":{"identifier":"deny-app-show","description":"Denies the app_show command without any pre-configured scope.","commands":{"allow":[],"deny":["app_show"]}},"deny-default-window-icon":{"identifier":"deny-default-window-icon","description":"Denies the default_window_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["default_window_icon"]}},"deny-fetch-data-store-identifiers":{"identifier":"deny-fetch-data-store-identifiers","description":"Denies the fetch_data_store_identifiers command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch_data_store_identifiers"]}},"deny-identifier":{"identifier":"deny-identifier","description":"Denies the identifier command without any pre-configured scope.","commands":{"allow":[],"deny":["identifier"]}},"deny-name":{"identifier":"deny-name","description":"Denies the name command without any pre-configured scope.","commands":{"allow":[],"deny":["name"]}},"deny-remove-data-store":{"identifier":"deny-remove-data-store","description":"Denies the remove_data_store command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_data_store"]}},"deny-set-app-theme":{"identifier":"deny-set-app-theme","description":"Denies the set_app_theme command without any pre-configured scope.","commands":{"allow":[],"deny":["set_app_theme"]}},"deny-tauri-version":{"identifier":"deny-tauri-version","description":"Denies the tauri_version command without any pre-configured scope.","commands":{"allow":[],"deny":["tauri_version"]}},"deny-version":{"identifier":"deny-version","description":"Denies the version command without any pre-configured scope.","commands":{"allow":[],"deny":["version"]}}},"permission_sets":{},"global_scope_schema":null},"core:event":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-listen","allow-unlisten","allow-emit","allow-emit-to"]},"permissions":{"allow-emit":{"identifier":"allow-emit","description":"Enables the emit command without any pre-configured scope.","commands":{"allow":["emit"],"deny":[]}},"allow-emit-to":{"identifier":"allow-emit-to","description":"Enables the emit_to command without any pre-configured scope.","commands":{"allow":["emit_to"],"deny":[]}},"allow-listen":{"identifier":"allow-listen","description":"Enables the listen command without any pre-configured scope.","commands":{"allow":["listen"],"deny":[]}},"allow-unlisten":{"identifier":"allow-unlisten","description":"Enables the unlisten command without any pre-configured scope.","commands":{"allow":["unlisten"],"deny":[]}},"deny-emit":{"identifier":"deny-emit","description":"Denies the emit command without any pre-configured scope.","commands":{"allow":[],"deny":["emit"]}},"deny-emit-to":{"identifier":"deny-emit-to","description":"Denies the emit_to command without any pre-configured scope.","commands":{"allow":[],"deny":["emit_to"]}},"deny-listen":{"identifier":"deny-listen","description":"Denies the listen command without any pre-configured scope.","commands":{"allow":[],"deny":["listen"]}},"deny-unlisten":{"identifier":"deny-unlisten","description":"Denies the unlisten command without any pre-configured scope.","commands":{"allow":[],"deny":["unlisten"]}}},"permission_sets":{},"global_scope_schema":null},"core:image":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-new","allow-from-bytes","allow-from-path","allow-rgba","allow-size"]},"permissions":{"allow-from-bytes":{"identifier":"allow-from-bytes","description":"Enables the from_bytes command without any pre-configured scope.","commands":{"allow":["from_bytes"],"deny":[]}},"allow-from-path":{"identifier":"allow-from-path","description":"Enables the from_path command without any pre-configured scope.","commands":{"allow":["from_path"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-rgba":{"identifier":"allow-rgba","description":"Enables the rgba command without any pre-configured scope.","commands":{"allow":["rgba"],"deny":[]}},"allow-size":{"identifier":"allow-size","description":"Enables the size command without any pre-configured scope.","commands":{"allow":["size"],"deny":[]}},"deny-from-bytes":{"identifier":"deny-from-bytes","description":"Denies the from_bytes command without any pre-configured scope.","commands":{"allow":[],"deny":["from_bytes"]}},"deny-from-path":{"identifier":"deny-from-path","description":"Denies the from_path command without any pre-configured scope.","commands":{"allow":[],"deny":["from_path"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-rgba":{"identifier":"deny-rgba","description":"Denies the rgba command without any pre-configured scope.","commands":{"allow":[],"deny":["rgba"]}},"deny-size":{"identifier":"deny-size","description":"Denies the size command without any pre-configured scope.","commands":{"allow":[],"deny":["size"]}}},"permission_sets":{},"global_scope_schema":null},"core:menu":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-new","allow-append","allow-prepend","allow-insert","allow-remove","allow-remove-at","allow-items","allow-get","allow-popup","allow-create-default","allow-set-as-app-menu","allow-set-as-window-menu","allow-text","allow-set-text","allow-is-enabled","allow-set-enabled","allow-set-accelerator","allow-set-as-windows-menu-for-nsapp","allow-set-as-help-menu-for-nsapp","allow-is-checked","allow-set-checked","allow-set-icon"]},"permissions":{"allow-append":{"identifier":"allow-append","description":"Enables the append command without any pre-configured scope.","commands":{"allow":["append"],"deny":[]}},"allow-create-default":{"identifier":"allow-create-default","description":"Enables the create_default command without any pre-configured scope.","commands":{"allow":["create_default"],"deny":[]}},"allow-get":{"identifier":"allow-get","description":"Enables the get command without any pre-configured scope.","commands":{"allow":["get"],"deny":[]}},"allow-insert":{"identifier":"allow-insert","description":"Enables the insert command without any pre-configured scope.","commands":{"allow":["insert"],"deny":[]}},"allow-is-checked":{"identifier":"allow-is-checked","description":"Enables the is_checked command without any pre-configured scope.","commands":{"allow":["is_checked"],"deny":[]}},"allow-is-enabled":{"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]}},"allow-items":{"identifier":"allow-items","description":"Enables the items command without any pre-configured scope.","commands":{"allow":["items"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-popup":{"identifier":"allow-popup","description":"Enables the popup command without any pre-configured scope.","commands":{"allow":["popup"],"deny":[]}},"allow-prepend":{"identifier":"allow-prepend","description":"Enables the prepend command without any pre-configured scope.","commands":{"allow":["prepend"],"deny":[]}},"allow-remove":{"identifier":"allow-remove","description":"Enables the remove command without any pre-configured scope.","commands":{"allow":["remove"],"deny":[]}},"allow-remove-at":{"identifier":"allow-remove-at","description":"Enables the remove_at command without any pre-configured scope.","commands":{"allow":["remove_at"],"deny":[]}},"allow-set-accelerator":{"identifier":"allow-set-accelerator","description":"Enables the set_accelerator command without any pre-configured scope.","commands":{"allow":["set_accelerator"],"deny":[]}},"allow-set-as-app-menu":{"identifier":"allow-set-as-app-menu","description":"Enables the set_as_app_menu command without any pre-configured scope.","commands":{"allow":["set_as_app_menu"],"deny":[]}},"allow-set-as-help-menu-for-nsapp":{"identifier":"allow-set-as-help-menu-for-nsapp","description":"Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":["set_as_help_menu_for_nsapp"],"deny":[]}},"allow-set-as-window-menu":{"identifier":"allow-set-as-window-menu","description":"Enables the set_as_window_menu command without any pre-configured scope.","commands":{"allow":["set_as_window_menu"],"deny":[]}},"allow-set-as-windows-menu-for-nsapp":{"identifier":"allow-set-as-windows-menu-for-nsapp","description":"Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":["set_as_windows_menu_for_nsapp"],"deny":[]}},"allow-set-checked":{"identifier":"allow-set-checked","description":"Enables the set_checked command without any pre-configured scope.","commands":{"allow":["set_checked"],"deny":[]}},"allow-set-enabled":{"identifier":"allow-set-enabled","description":"Enables the set_enabled command without any pre-configured scope.","commands":{"allow":["set_enabled"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-text":{"identifier":"allow-set-text","description":"Enables the set_text command without any pre-configured scope.","commands":{"allow":["set_text"],"deny":[]}},"allow-text":{"identifier":"allow-text","description":"Enables the text command without any pre-configured scope.","commands":{"allow":["text"],"deny":[]}},"deny-append":{"identifier":"deny-append","description":"Denies the append command without any pre-configured scope.","commands":{"allow":[],"deny":["append"]}},"deny-create-default":{"identifier":"deny-create-default","description":"Denies the create_default command without any pre-configured scope.","commands":{"allow":[],"deny":["create_default"]}},"deny-get":{"identifier":"deny-get","description":"Denies the get command without any pre-configured scope.","commands":{"allow":[],"deny":["get"]}},"deny-insert":{"identifier":"deny-insert","description":"Denies the insert command without any pre-configured scope.","commands":{"allow":[],"deny":["insert"]}},"deny-is-checked":{"identifier":"deny-is-checked","description":"Denies the is_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["is_checked"]}},"deny-is-enabled":{"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]}},"deny-items":{"identifier":"deny-items","description":"Denies the items command without any pre-configured scope.","commands":{"allow":[],"deny":["items"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-popup":{"identifier":"deny-popup","description":"Denies the popup command without any pre-configured scope.","commands":{"allow":[],"deny":["popup"]}},"deny-prepend":{"identifier":"deny-prepend","description":"Denies the prepend command without any pre-configured scope.","commands":{"allow":[],"deny":["prepend"]}},"deny-remove":{"identifier":"deny-remove","description":"Denies the remove command without any pre-configured scope.","commands":{"allow":[],"deny":["remove"]}},"deny-remove-at":{"identifier":"deny-remove-at","description":"Denies the remove_at command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_at"]}},"deny-set-accelerator":{"identifier":"deny-set-accelerator","description":"Denies the set_accelerator command without any pre-configured scope.","commands":{"allow":[],"deny":["set_accelerator"]}},"deny-set-as-app-menu":{"identifier":"deny-set-as-app-menu","description":"Denies the set_as_app_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_app_menu"]}},"deny-set-as-help-menu-for-nsapp":{"identifier":"deny-set-as-help-menu-for-nsapp","description":"Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_help_menu_for_nsapp"]}},"deny-set-as-window-menu":{"identifier":"deny-set-as-window-menu","description":"Denies the set_as_window_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_window_menu"]}},"deny-set-as-windows-menu-for-nsapp":{"identifier":"deny-set-as-windows-menu-for-nsapp","description":"Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.","commands":{"allow":[],"deny":["set_as_windows_menu_for_nsapp"]}},"deny-set-checked":{"identifier":"deny-set-checked","description":"Denies the set_checked command without any pre-configured scope.","commands":{"allow":[],"deny":["set_checked"]}},"deny-set-enabled":{"identifier":"deny-set-enabled","description":"Denies the set_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["set_enabled"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-text":{"identifier":"deny-set-text","description":"Denies the set_text command without any pre-configured scope.","commands":{"allow":[],"deny":["set_text"]}},"deny-text":{"identifier":"deny-text","description":"Denies the text command without any pre-configured scope.","commands":{"allow":[],"deny":["text"]}}},"permission_sets":{},"global_scope_schema":null},"core:path":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-resolve-directory","allow-resolve","allow-normalize","allow-join","allow-dirname","allow-extname","allow-basename","allow-is-absolute"]},"permissions":{"allow-basename":{"identifier":"allow-basename","description":"Enables the basename command without any pre-configured scope.","commands":{"allow":["basename"],"deny":[]}},"allow-dirname":{"identifier":"allow-dirname","description":"Enables the dirname command without any pre-configured scope.","commands":{"allow":["dirname"],"deny":[]}},"allow-extname":{"identifier":"allow-extname","description":"Enables the extname command without any pre-configured scope.","commands":{"allow":["extname"],"deny":[]}},"allow-is-absolute":{"identifier":"allow-is-absolute","description":"Enables the is_absolute command without any pre-configured scope.","commands":{"allow":["is_absolute"],"deny":[]}},"allow-join":{"identifier":"allow-join","description":"Enables the join command without any pre-configured scope.","commands":{"allow":["join"],"deny":[]}},"allow-normalize":{"identifier":"allow-normalize","description":"Enables the normalize command without any pre-configured scope.","commands":{"allow":["normalize"],"deny":[]}},"allow-resolve":{"identifier":"allow-resolve","description":"Enables the resolve command without any pre-configured scope.","commands":{"allow":["resolve"],"deny":[]}},"allow-resolve-directory":{"identifier":"allow-resolve-directory","description":"Enables the resolve_directory command without any pre-configured scope.","commands":{"allow":["resolve_directory"],"deny":[]}},"deny-basename":{"identifier":"deny-basename","description":"Denies the basename command without any pre-configured scope.","commands":{"allow":[],"deny":["basename"]}},"deny-dirname":{"identifier":"deny-dirname","description":"Denies the dirname command without any pre-configured scope.","commands":{"allow":[],"deny":["dirname"]}},"deny-extname":{"identifier":"deny-extname","description":"Denies the extname command without any pre-configured scope.","commands":{"allow":[],"deny":["extname"]}},"deny-is-absolute":{"identifier":"deny-is-absolute","description":"Denies the is_absolute command without any pre-configured scope.","commands":{"allow":[],"deny":["is_absolute"]}},"deny-join":{"identifier":"deny-join","description":"Denies the join command without any pre-configured scope.","commands":{"allow":[],"deny":["join"]}},"deny-normalize":{"identifier":"deny-normalize","description":"Denies the normalize command without any pre-configured scope.","commands":{"allow":[],"deny":["normalize"]}},"deny-resolve":{"identifier":"deny-resolve","description":"Denies the resolve command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve"]}},"deny-resolve-directory":{"identifier":"deny-resolve-directory","description":"Denies the resolve_directory command without any pre-configured scope.","commands":{"allow":[],"deny":["resolve_directory"]}}},"permission_sets":{},"global_scope_schema":null},"core:resources":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-close"]},"permissions":{"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}}},"permission_sets":{},"global_scope_schema":null},"core:tray":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin, which enables all commands.","permissions":["allow-new","allow-get-by-id","allow-remove-by-id","allow-set-icon","allow-set-menu","allow-set-tooltip","allow-set-title","allow-set-visible","allow-set-temp-dir-path","allow-set-icon-as-template","allow-set-show-menu-on-left-click"]},"permissions":{"allow-get-by-id":{"identifier":"allow-get-by-id","description":"Enables the get_by_id command without any pre-configured scope.","commands":{"allow":["get_by_id"],"deny":[]}},"allow-new":{"identifier":"allow-new","description":"Enables the new command without any pre-configured scope.","commands":{"allow":["new"],"deny":[]}},"allow-remove-by-id":{"identifier":"allow-remove-by-id","description":"Enables the remove_by_id command without any pre-configured scope.","commands":{"allow":["remove_by_id"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-icon-as-template":{"identifier":"allow-set-icon-as-template","description":"Enables the set_icon_as_template command without any pre-configured scope.","commands":{"allow":["set_icon_as_template"],"deny":[]}},"allow-set-menu":{"identifier":"allow-set-menu","description":"Enables the set_menu command without any pre-configured scope.","commands":{"allow":["set_menu"],"deny":[]}},"allow-set-show-menu-on-left-click":{"identifier":"allow-set-show-menu-on-left-click","description":"Enables the set_show_menu_on_left_click command without any pre-configured scope.","commands":{"allow":["set_show_menu_on_left_click"],"deny":[]}},"allow-set-temp-dir-path":{"identifier":"allow-set-temp-dir-path","description":"Enables the set_temp_dir_path command without any pre-configured scope.","commands":{"allow":["set_temp_dir_path"],"deny":[]}},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]}},"allow-set-tooltip":{"identifier":"allow-set-tooltip","description":"Enables the set_tooltip command without any pre-configured scope.","commands":{"allow":["set_tooltip"],"deny":[]}},"allow-set-visible":{"identifier":"allow-set-visible","description":"Enables the set_visible command without any pre-configured scope.","commands":{"allow":["set_visible"],"deny":[]}},"deny-get-by-id":{"identifier":"deny-get-by-id","description":"Denies the get_by_id command without any pre-configured scope.","commands":{"allow":[],"deny":["get_by_id"]}},"deny-new":{"identifier":"deny-new","description":"Denies the new command without any pre-configured scope.","commands":{"allow":[],"deny":["new"]}},"deny-remove-by-id":{"identifier":"deny-remove-by-id","description":"Denies the remove_by_id command without any pre-configured scope.","commands":{"allow":[],"deny":["remove_by_id"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-icon-as-template":{"identifier":"deny-set-icon-as-template","description":"Denies the set_icon_as_template command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon_as_template"]}},"deny-set-menu":{"identifier":"deny-set-menu","description":"Denies the set_menu command without any pre-configured scope.","commands":{"allow":[],"deny":["set_menu"]}},"deny-set-show-menu-on-left-click":{"identifier":"deny-set-show-menu-on-left-click","description":"Denies the set_show_menu_on_left_click command without any pre-configured scope.","commands":{"allow":[],"deny":["set_show_menu_on_left_click"]}},"deny-set-temp-dir-path":{"identifier":"deny-set-temp-dir-path","description":"Denies the set_temp_dir_path command without any pre-configured scope.","commands":{"allow":[],"deny":["set_temp_dir_path"]}},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]}},"deny-set-tooltip":{"identifier":"deny-set-tooltip","description":"Denies the set_tooltip command without any pre-configured scope.","commands":{"allow":[],"deny":["set_tooltip"]}},"deny-set-visible":{"identifier":"deny-set-visible","description":"Denies the set_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible"]}}},"permission_sets":{},"global_scope_schema":null},"core:webview":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-get-all-webviews","allow-webview-position","allow-webview-size","allow-internal-toggle-devtools"]},"permissions":{"allow-clear-all-browsing-data":{"identifier":"allow-clear-all-browsing-data","description":"Enables the clear_all_browsing_data command without any pre-configured scope.","commands":{"allow":["clear_all_browsing_data"],"deny":[]}},"allow-create-webview":{"identifier":"allow-create-webview","description":"Enables the create_webview command without any pre-configured scope.","commands":{"allow":["create_webview"],"deny":[]}},"allow-create-webview-window":{"identifier":"allow-create-webview-window","description":"Enables the create_webview_window command without any pre-configured scope.","commands":{"allow":["create_webview_window"],"deny":[]}},"allow-get-all-webviews":{"identifier":"allow-get-all-webviews","description":"Enables the get_all_webviews command without any pre-configured scope.","commands":{"allow":["get_all_webviews"],"deny":[]}},"allow-internal-toggle-devtools":{"identifier":"allow-internal-toggle-devtools","description":"Enables the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":["internal_toggle_devtools"],"deny":[]}},"allow-print":{"identifier":"allow-print","description":"Enables the print command without any pre-configured scope.","commands":{"allow":["print"],"deny":[]}},"allow-reparent":{"identifier":"allow-reparent","description":"Enables the reparent command without any pre-configured scope.","commands":{"allow":["reparent"],"deny":[]}},"allow-set-webview-background-color":{"identifier":"allow-set-webview-background-color","description":"Enables the set_webview_background_color command without any pre-configured scope.","commands":{"allow":["set_webview_background_color"],"deny":[]}},"allow-set-webview-focus":{"identifier":"allow-set-webview-focus","description":"Enables the set_webview_focus command without any pre-configured scope.","commands":{"allow":["set_webview_focus"],"deny":[]}},"allow-set-webview-position":{"identifier":"allow-set-webview-position","description":"Enables the set_webview_position command without any pre-configured scope.","commands":{"allow":["set_webview_position"],"deny":[]}},"allow-set-webview-size":{"identifier":"allow-set-webview-size","description":"Enables the set_webview_size command without any pre-configured scope.","commands":{"allow":["set_webview_size"],"deny":[]}},"allow-set-webview-zoom":{"identifier":"allow-set-webview-zoom","description":"Enables the set_webview_zoom command without any pre-configured scope.","commands":{"allow":["set_webview_zoom"],"deny":[]}},"allow-webview-close":{"identifier":"allow-webview-close","description":"Enables the webview_close command without any pre-configured scope.","commands":{"allow":["webview_close"],"deny":[]}},"allow-webview-hide":{"identifier":"allow-webview-hide","description":"Enables the webview_hide command without any pre-configured scope.","commands":{"allow":["webview_hide"],"deny":[]}},"allow-webview-position":{"identifier":"allow-webview-position","description":"Enables the webview_position command without any pre-configured scope.","commands":{"allow":["webview_position"],"deny":[]}},"allow-webview-show":{"identifier":"allow-webview-show","description":"Enables the webview_show command without any pre-configured scope.","commands":{"allow":["webview_show"],"deny":[]}},"allow-webview-size":{"identifier":"allow-webview-size","description":"Enables the webview_size command without any pre-configured scope.","commands":{"allow":["webview_size"],"deny":[]}},"deny-clear-all-browsing-data":{"identifier":"deny-clear-all-browsing-data","description":"Denies the clear_all_browsing_data command without any pre-configured scope.","commands":{"allow":[],"deny":["clear_all_browsing_data"]}},"deny-create-webview":{"identifier":"deny-create-webview","description":"Denies the create_webview command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview"]}},"deny-create-webview-window":{"identifier":"deny-create-webview-window","description":"Denies the create_webview_window command without any pre-configured scope.","commands":{"allow":[],"deny":["create_webview_window"]}},"deny-get-all-webviews":{"identifier":"deny-get-all-webviews","description":"Denies the get_all_webviews command without any pre-configured scope.","commands":{"allow":[],"deny":["get_all_webviews"]}},"deny-internal-toggle-devtools":{"identifier":"deny-internal-toggle-devtools","description":"Denies the internal_toggle_devtools command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_devtools"]}},"deny-print":{"identifier":"deny-print","description":"Denies the print command without any pre-configured scope.","commands":{"allow":[],"deny":["print"]}},"deny-reparent":{"identifier":"deny-reparent","description":"Denies the reparent command without any pre-configured scope.","commands":{"allow":[],"deny":["reparent"]}},"deny-set-webview-background-color":{"identifier":"deny-set-webview-background-color","description":"Denies the set_webview_background_color command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_background_color"]}},"deny-set-webview-focus":{"identifier":"deny-set-webview-focus","description":"Denies the set_webview_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_focus"]}},"deny-set-webview-position":{"identifier":"deny-set-webview-position","description":"Denies the set_webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_position"]}},"deny-set-webview-size":{"identifier":"deny-set-webview-size","description":"Denies the set_webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_size"]}},"deny-set-webview-zoom":{"identifier":"deny-set-webview-zoom","description":"Denies the set_webview_zoom command without any pre-configured scope.","commands":{"allow":[],"deny":["set_webview_zoom"]}},"deny-webview-close":{"identifier":"deny-webview-close","description":"Denies the webview_close command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_close"]}},"deny-webview-hide":{"identifier":"deny-webview-hide","description":"Denies the webview_hide command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_hide"]}},"deny-webview-position":{"identifier":"deny-webview-position","description":"Denies the webview_position command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_position"]}},"deny-webview-show":{"identifier":"deny-webview-show","description":"Denies the webview_show command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_show"]}},"deny-webview-size":{"identifier":"deny-webview-size","description":"Denies the webview_size command without any pre-configured scope.","commands":{"allow":[],"deny":["webview_size"]}}},"permission_sets":{},"global_scope_schema":null},"core:window":{"default_permission":{"identifier":"default","description":"Default permissions for the plugin.","permissions":["allow-get-all-windows","allow-scale-factor","allow-inner-position","allow-outer-position","allow-inner-size","allow-outer-size","allow-is-fullscreen","allow-is-minimized","allow-is-maximized","allow-is-focused","allow-is-decorated","allow-is-resizable","allow-is-maximizable","allow-is-minimizable","allow-is-closable","allow-is-visible","allow-is-enabled","allow-title","allow-current-monitor","allow-primary-monitor","allow-monitor-from-point","allow-available-monitors","allow-cursor-position","allow-theme","allow-is-always-on-top","allow-internal-toggle-maximize"]},"permissions":{"allow-available-monitors":{"identifier":"allow-available-monitors","description":"Enables the available_monitors command without any pre-configured scope.","commands":{"allow":["available_monitors"],"deny":[]}},"allow-center":{"identifier":"allow-center","description":"Enables the center command without any pre-configured scope.","commands":{"allow":["center"],"deny":[]}},"allow-close":{"identifier":"allow-close","description":"Enables the close command without any pre-configured scope.","commands":{"allow":["close"],"deny":[]}},"allow-create":{"identifier":"allow-create","description":"Enables the create command without any pre-configured scope.","commands":{"allow":["create"],"deny":[]}},"allow-current-monitor":{"identifier":"allow-current-monitor","description":"Enables the current_monitor command without any pre-configured scope.","commands":{"allow":["current_monitor"],"deny":[]}},"allow-cursor-position":{"identifier":"allow-cursor-position","description":"Enables the cursor_position command without any pre-configured scope.","commands":{"allow":["cursor_position"],"deny":[]}},"allow-destroy":{"identifier":"allow-destroy","description":"Enables the destroy command without any pre-configured scope.","commands":{"allow":["destroy"],"deny":[]}},"allow-get-all-windows":{"identifier":"allow-get-all-windows","description":"Enables the get_all_windows command without any pre-configured scope.","commands":{"allow":["get_all_windows"],"deny":[]}},"allow-hide":{"identifier":"allow-hide","description":"Enables the hide command without any pre-configured scope.","commands":{"allow":["hide"],"deny":[]}},"allow-inner-position":{"identifier":"allow-inner-position","description":"Enables the inner_position command without any pre-configured scope.","commands":{"allow":["inner_position"],"deny":[]}},"allow-inner-size":{"identifier":"allow-inner-size","description":"Enables the inner_size command without any pre-configured scope.","commands":{"allow":["inner_size"],"deny":[]}},"allow-internal-toggle-maximize":{"identifier":"allow-internal-toggle-maximize","description":"Enables the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":["internal_toggle_maximize"],"deny":[]}},"allow-is-always-on-top":{"identifier":"allow-is-always-on-top","description":"Enables the is_always_on_top command without any pre-configured scope.","commands":{"allow":["is_always_on_top"],"deny":[]}},"allow-is-closable":{"identifier":"allow-is-closable","description":"Enables the is_closable command without any pre-configured scope.","commands":{"allow":["is_closable"],"deny":[]}},"allow-is-decorated":{"identifier":"allow-is-decorated","description":"Enables the is_decorated command without any pre-configured scope.","commands":{"allow":["is_decorated"],"deny":[]}},"allow-is-enabled":{"identifier":"allow-is-enabled","description":"Enables the is_enabled command without any pre-configured scope.","commands":{"allow":["is_enabled"],"deny":[]}},"allow-is-focused":{"identifier":"allow-is-focused","description":"Enables the is_focused command without any pre-configured scope.","commands":{"allow":["is_focused"],"deny":[]}},"allow-is-fullscreen":{"identifier":"allow-is-fullscreen","description":"Enables the is_fullscreen command without any pre-configured scope.","commands":{"allow":["is_fullscreen"],"deny":[]}},"allow-is-maximizable":{"identifier":"allow-is-maximizable","description":"Enables the is_maximizable command without any pre-configured scope.","commands":{"allow":["is_maximizable"],"deny":[]}},"allow-is-maximized":{"identifier":"allow-is-maximized","description":"Enables the is_maximized command without any pre-configured scope.","commands":{"allow":["is_maximized"],"deny":[]}},"allow-is-minimizable":{"identifier":"allow-is-minimizable","description":"Enables the is_minimizable command without any pre-configured scope.","commands":{"allow":["is_minimizable"],"deny":[]}},"allow-is-minimized":{"identifier":"allow-is-minimized","description":"Enables the is_minimized command without any pre-configured scope.","commands":{"allow":["is_minimized"],"deny":[]}},"allow-is-resizable":{"identifier":"allow-is-resizable","description":"Enables the is_resizable command without any pre-configured scope.","commands":{"allow":["is_resizable"],"deny":[]}},"allow-is-visible":{"identifier":"allow-is-visible","description":"Enables the is_visible command without any pre-configured scope.","commands":{"allow":["is_visible"],"deny":[]}},"allow-maximize":{"identifier":"allow-maximize","description":"Enables the maximize command without any pre-configured scope.","commands":{"allow":["maximize"],"deny":[]}},"allow-minimize":{"identifier":"allow-minimize","description":"Enables the minimize command without any pre-configured scope.","commands":{"allow":["minimize"],"deny":[]}},"allow-monitor-from-point":{"identifier":"allow-monitor-from-point","description":"Enables the monitor_from_point command without any pre-configured scope.","commands":{"allow":["monitor_from_point"],"deny":[]}},"allow-outer-position":{"identifier":"allow-outer-position","description":"Enables the outer_position command without any pre-configured scope.","commands":{"allow":["outer_position"],"deny":[]}},"allow-outer-size":{"identifier":"allow-outer-size","description":"Enables the outer_size command without any pre-configured scope.","commands":{"allow":["outer_size"],"deny":[]}},"allow-primary-monitor":{"identifier":"allow-primary-monitor","description":"Enables the primary_monitor command without any pre-configured scope.","commands":{"allow":["primary_monitor"],"deny":[]}},"allow-request-user-attention":{"identifier":"allow-request-user-attention","description":"Enables the request_user_attention command without any pre-configured scope.","commands":{"allow":["request_user_attention"],"deny":[]}},"allow-scale-factor":{"identifier":"allow-scale-factor","description":"Enables the scale_factor command without any pre-configured scope.","commands":{"allow":["scale_factor"],"deny":[]}},"allow-set-always-on-bottom":{"identifier":"allow-set-always-on-bottom","description":"Enables the set_always_on_bottom command without any pre-configured scope.","commands":{"allow":["set_always_on_bottom"],"deny":[]}},"allow-set-always-on-top":{"identifier":"allow-set-always-on-top","description":"Enables the set_always_on_top command without any pre-configured scope.","commands":{"allow":["set_always_on_top"],"deny":[]}},"allow-set-background-color":{"identifier":"allow-set-background-color","description":"Enables the set_background_color command without any pre-configured scope.","commands":{"allow":["set_background_color"],"deny":[]}},"allow-set-badge-count":{"identifier":"allow-set-badge-count","description":"Enables the set_badge_count command without any pre-configured scope.","commands":{"allow":["set_badge_count"],"deny":[]}},"allow-set-badge-label":{"identifier":"allow-set-badge-label","description":"Enables the set_badge_label command without any pre-configured scope.","commands":{"allow":["set_badge_label"],"deny":[]}},"allow-set-closable":{"identifier":"allow-set-closable","description":"Enables the set_closable command without any pre-configured scope.","commands":{"allow":["set_closable"],"deny":[]}},"allow-set-content-protected":{"identifier":"allow-set-content-protected","description":"Enables the set_content_protected command without any pre-configured scope.","commands":{"allow":["set_content_protected"],"deny":[]}},"allow-set-cursor-grab":{"identifier":"allow-set-cursor-grab","description":"Enables the set_cursor_grab command without any pre-configured scope.","commands":{"allow":["set_cursor_grab"],"deny":[]}},"allow-set-cursor-icon":{"identifier":"allow-set-cursor-icon","description":"Enables the set_cursor_icon command without any pre-configured scope.","commands":{"allow":["set_cursor_icon"],"deny":[]}},"allow-set-cursor-position":{"identifier":"allow-set-cursor-position","description":"Enables the set_cursor_position command without any pre-configured scope.","commands":{"allow":["set_cursor_position"],"deny":[]}},"allow-set-cursor-visible":{"identifier":"allow-set-cursor-visible","description":"Enables the set_cursor_visible command without any pre-configured scope.","commands":{"allow":["set_cursor_visible"],"deny":[]}},"allow-set-decorations":{"identifier":"allow-set-decorations","description":"Enables the set_decorations command without any pre-configured scope.","commands":{"allow":["set_decorations"],"deny":[]}},"allow-set-effects":{"identifier":"allow-set-effects","description":"Enables the set_effects command without any pre-configured scope.","commands":{"allow":["set_effects"],"deny":[]}},"allow-set-enabled":{"identifier":"allow-set-enabled","description":"Enables the set_enabled command without any pre-configured scope.","commands":{"allow":["set_enabled"],"deny":[]}},"allow-set-focus":{"identifier":"allow-set-focus","description":"Enables the set_focus command without any pre-configured scope.","commands":{"allow":["set_focus"],"deny":[]}},"allow-set-fullscreen":{"identifier":"allow-set-fullscreen","description":"Enables the set_fullscreen command without any pre-configured scope.","commands":{"allow":["set_fullscreen"],"deny":[]}},"allow-set-icon":{"identifier":"allow-set-icon","description":"Enables the set_icon command without any pre-configured scope.","commands":{"allow":["set_icon"],"deny":[]}},"allow-set-ignore-cursor-events":{"identifier":"allow-set-ignore-cursor-events","description":"Enables the set_ignore_cursor_events command without any pre-configured scope.","commands":{"allow":["set_ignore_cursor_events"],"deny":[]}},"allow-set-max-size":{"identifier":"allow-set-max-size","description":"Enables the set_max_size command without any pre-configured scope.","commands":{"allow":["set_max_size"],"deny":[]}},"allow-set-maximizable":{"identifier":"allow-set-maximizable","description":"Enables the set_maximizable command without any pre-configured scope.","commands":{"allow":["set_maximizable"],"deny":[]}},"allow-set-min-size":{"identifier":"allow-set-min-size","description":"Enables the set_min_size command without any pre-configured scope.","commands":{"allow":["set_min_size"],"deny":[]}},"allow-set-minimizable":{"identifier":"allow-set-minimizable","description":"Enables the set_minimizable command without any pre-configured scope.","commands":{"allow":["set_minimizable"],"deny":[]}},"allow-set-overlay-icon":{"identifier":"allow-set-overlay-icon","description":"Enables the set_overlay_icon command without any pre-configured scope.","commands":{"allow":["set_overlay_icon"],"deny":[]}},"allow-set-position":{"identifier":"allow-set-position","description":"Enables the set_position command without any pre-configured scope.","commands":{"allow":["set_position"],"deny":[]}},"allow-set-progress-bar":{"identifier":"allow-set-progress-bar","description":"Enables the set_progress_bar command without any pre-configured scope.","commands":{"allow":["set_progress_bar"],"deny":[]}},"allow-set-resizable":{"identifier":"allow-set-resizable","description":"Enables the set_resizable command without any pre-configured scope.","commands":{"allow":["set_resizable"],"deny":[]}},"allow-set-shadow":{"identifier":"allow-set-shadow","description":"Enables the set_shadow command without any pre-configured scope.","commands":{"allow":["set_shadow"],"deny":[]}},"allow-set-size":{"identifier":"allow-set-size","description":"Enables the set_size command without any pre-configured scope.","commands":{"allow":["set_size"],"deny":[]}},"allow-set-size-constraints":{"identifier":"allow-set-size-constraints","description":"Enables the set_size_constraints command without any pre-configured scope.","commands":{"allow":["set_size_constraints"],"deny":[]}},"allow-set-skip-taskbar":{"identifier":"allow-set-skip-taskbar","description":"Enables the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":["set_skip_taskbar"],"deny":[]}},"allow-set-theme":{"identifier":"allow-set-theme","description":"Enables the set_theme command without any pre-configured scope.","commands":{"allow":["set_theme"],"deny":[]}},"allow-set-title":{"identifier":"allow-set-title","description":"Enables the set_title command without any pre-configured scope.","commands":{"allow":["set_title"],"deny":[]}},"allow-set-title-bar-style":{"identifier":"allow-set-title-bar-style","description":"Enables the set_title_bar_style command without any pre-configured scope.","commands":{"allow":["set_title_bar_style"],"deny":[]}},"allow-set-visible-on-all-workspaces":{"identifier":"allow-set-visible-on-all-workspaces","description":"Enables the set_visible_on_all_workspaces command without any pre-configured scope.","commands":{"allow":["set_visible_on_all_workspaces"],"deny":[]}},"allow-show":{"identifier":"allow-show","description":"Enables the show command without any pre-configured scope.","commands":{"allow":["show"],"deny":[]}},"allow-start-dragging":{"identifier":"allow-start-dragging","description":"Enables the start_dragging command without any pre-configured scope.","commands":{"allow":["start_dragging"],"deny":[]}},"allow-start-resize-dragging":{"identifier":"allow-start-resize-dragging","description":"Enables the start_resize_dragging command without any pre-configured scope.","commands":{"allow":["start_resize_dragging"],"deny":[]}},"allow-theme":{"identifier":"allow-theme","description":"Enables the theme command without any pre-configured scope.","commands":{"allow":["theme"],"deny":[]}},"allow-title":{"identifier":"allow-title","description":"Enables the title command without any pre-configured scope.","commands":{"allow":["title"],"deny":[]}},"allow-toggle-maximize":{"identifier":"allow-toggle-maximize","description":"Enables the toggle_maximize command without any pre-configured scope.","commands":{"allow":["toggle_maximize"],"deny":[]}},"allow-unmaximize":{"identifier":"allow-unmaximize","description":"Enables the unmaximize command without any pre-configured scope.","commands":{"allow":["unmaximize"],"deny":[]}},"allow-unminimize":{"identifier":"allow-unminimize","description":"Enables the unminimize command without any pre-configured scope.","commands":{"allow":["unminimize"],"deny":[]}},"deny-available-monitors":{"identifier":"deny-available-monitors","description":"Denies the available_monitors command without any pre-configured scope.","commands":{"allow":[],"deny":["available_monitors"]}},"deny-center":{"identifier":"deny-center","description":"Denies the center command without any pre-configured scope.","commands":{"allow":[],"deny":["center"]}},"deny-close":{"identifier":"deny-close","description":"Denies the close command without any pre-configured scope.","commands":{"allow":[],"deny":["close"]}},"deny-create":{"identifier":"deny-create","description":"Denies the create command without any pre-configured scope.","commands":{"allow":[],"deny":["create"]}},"deny-current-monitor":{"identifier":"deny-current-monitor","description":"Denies the current_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["current_monitor"]}},"deny-cursor-position":{"identifier":"deny-cursor-position","description":"Denies the cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["cursor_position"]}},"deny-destroy":{"identifier":"deny-destroy","description":"Denies the destroy command without any pre-configured scope.","commands":{"allow":[],"deny":["destroy"]}},"deny-get-all-windows":{"identifier":"deny-get-all-windows","description":"Denies the get_all_windows command without any pre-configured scope.","commands":{"allow":[],"deny":["get_all_windows"]}},"deny-hide":{"identifier":"deny-hide","description":"Denies the hide command without any pre-configured scope.","commands":{"allow":[],"deny":["hide"]}},"deny-inner-position":{"identifier":"deny-inner-position","description":"Denies the inner_position command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_position"]}},"deny-inner-size":{"identifier":"deny-inner-size","description":"Denies the inner_size command without any pre-configured scope.","commands":{"allow":[],"deny":["inner_size"]}},"deny-internal-toggle-maximize":{"identifier":"deny-internal-toggle-maximize","description":"Denies the internal_toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["internal_toggle_maximize"]}},"deny-is-always-on-top":{"identifier":"deny-is-always-on-top","description":"Denies the is_always_on_top command without any pre-configured scope.","commands":{"allow":[],"deny":["is_always_on_top"]}},"deny-is-closable":{"identifier":"deny-is-closable","description":"Denies the is_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_closable"]}},"deny-is-decorated":{"identifier":"deny-is-decorated","description":"Denies the is_decorated command without any pre-configured scope.","commands":{"allow":[],"deny":["is_decorated"]}},"deny-is-enabled":{"identifier":"deny-is-enabled","description":"Denies the is_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["is_enabled"]}},"deny-is-focused":{"identifier":"deny-is-focused","description":"Denies the is_focused command without any pre-configured scope.","commands":{"allow":[],"deny":["is_focused"]}},"deny-is-fullscreen":{"identifier":"deny-is-fullscreen","description":"Denies the is_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["is_fullscreen"]}},"deny-is-maximizable":{"identifier":"deny-is-maximizable","description":"Denies the is_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximizable"]}},"deny-is-maximized":{"identifier":"deny-is-maximized","description":"Denies the is_maximized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_maximized"]}},"deny-is-minimizable":{"identifier":"deny-is-minimizable","description":"Denies the is_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimizable"]}},"deny-is-minimized":{"identifier":"deny-is-minimized","description":"Denies the is_minimized command without any pre-configured scope.","commands":{"allow":[],"deny":["is_minimized"]}},"deny-is-resizable":{"identifier":"deny-is-resizable","description":"Denies the is_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["is_resizable"]}},"deny-is-visible":{"identifier":"deny-is-visible","description":"Denies the is_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["is_visible"]}},"deny-maximize":{"identifier":"deny-maximize","description":"Denies the maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["maximize"]}},"deny-minimize":{"identifier":"deny-minimize","description":"Denies the minimize command without any pre-configured scope.","commands":{"allow":[],"deny":["minimize"]}},"deny-monitor-from-point":{"identifier":"deny-monitor-from-point","description":"Denies the monitor_from_point command without any pre-configured scope.","commands":{"allow":[],"deny":["monitor_from_point"]}},"deny-outer-position":{"identifier":"deny-outer-position","description":"Denies the outer_position command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_position"]}},"deny-outer-size":{"identifier":"deny-outer-size","description":"Denies the outer_size command without any pre-configured scope.","commands":{"allow":[],"deny":["outer_size"]}},"deny-primary-monitor":{"identifier":"deny-primary-monitor","description":"Denies the primary_monitor command without any pre-configured scope.","commands":{"allow":[],"deny":["primary_monitor"]}},"deny-request-user-attention":{"identifier":"deny-request-user-attention","description":"Denies the request_user_attention command without any pre-configured scope.","commands":{"allow":[],"deny":["request_user_attention"]}},"deny-scale-factor":{"identifier":"deny-scale-factor","description":"Denies the scale_factor command without any pre-configured scope.","commands":{"allow":[],"deny":["scale_factor"]}},"deny-set-always-on-bottom":{"identifier":"deny-set-always-on-bottom","description":"Denies the set_always_on_bottom command without any pre-configured scope.","commands":{"allow":[],"deny":["set_always_on_bottom"]}},"deny-set-always-on-top":{"identifier":"deny-set-always-on-top","description":"Denies the set_always_on_top command without any pre-configured scope.","commands":{"allow":[],"deny":["set_always_on_top"]}},"deny-set-background-color":{"identifier":"deny-set-background-color","description":"Denies the set_background_color command without any pre-configured scope.","commands":{"allow":[],"deny":["set_background_color"]}},"deny-set-badge-count":{"identifier":"deny-set-badge-count","description":"Denies the set_badge_count command without any pre-configured scope.","commands":{"allow":[],"deny":["set_badge_count"]}},"deny-set-badge-label":{"identifier":"deny-set-badge-label","description":"Denies the set_badge_label command without any pre-configured scope.","commands":{"allow":[],"deny":["set_badge_label"]}},"deny-set-closable":{"identifier":"deny-set-closable","description":"Denies the set_closable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_closable"]}},"deny-set-content-protected":{"identifier":"deny-set-content-protected","description":"Denies the set_content_protected command without any pre-configured scope.","commands":{"allow":[],"deny":["set_content_protected"]}},"deny-set-cursor-grab":{"identifier":"deny-set-cursor-grab","description":"Denies the set_cursor_grab command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_grab"]}},"deny-set-cursor-icon":{"identifier":"deny-set-cursor-icon","description":"Denies the set_cursor_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_icon"]}},"deny-set-cursor-position":{"identifier":"deny-set-cursor-position","description":"Denies the set_cursor_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_position"]}},"deny-set-cursor-visible":{"identifier":"deny-set-cursor-visible","description":"Denies the set_cursor_visible command without any pre-configured scope.","commands":{"allow":[],"deny":["set_cursor_visible"]}},"deny-set-decorations":{"identifier":"deny-set-decorations","description":"Denies the set_decorations command without any pre-configured scope.","commands":{"allow":[],"deny":["set_decorations"]}},"deny-set-effects":{"identifier":"deny-set-effects","description":"Denies the set_effects command without any pre-configured scope.","commands":{"allow":[],"deny":["set_effects"]}},"deny-set-enabled":{"identifier":"deny-set-enabled","description":"Denies the set_enabled command without any pre-configured scope.","commands":{"allow":[],"deny":["set_enabled"]}},"deny-set-focus":{"identifier":"deny-set-focus","description":"Denies the set_focus command without any pre-configured scope.","commands":{"allow":[],"deny":["set_focus"]}},"deny-set-fullscreen":{"identifier":"deny-set-fullscreen","description":"Denies the set_fullscreen command without any pre-configured scope.","commands":{"allow":[],"deny":["set_fullscreen"]}},"deny-set-icon":{"identifier":"deny-set-icon","description":"Denies the set_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_icon"]}},"deny-set-ignore-cursor-events":{"identifier":"deny-set-ignore-cursor-events","description":"Denies the set_ignore_cursor_events command without any pre-configured scope.","commands":{"allow":[],"deny":["set_ignore_cursor_events"]}},"deny-set-max-size":{"identifier":"deny-set-max-size","description":"Denies the set_max_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_max_size"]}},"deny-set-maximizable":{"identifier":"deny-set-maximizable","description":"Denies the set_maximizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_maximizable"]}},"deny-set-min-size":{"identifier":"deny-set-min-size","description":"Denies the set_min_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_min_size"]}},"deny-set-minimizable":{"identifier":"deny-set-minimizable","description":"Denies the set_minimizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_minimizable"]}},"deny-set-overlay-icon":{"identifier":"deny-set-overlay-icon","description":"Denies the set_overlay_icon command without any pre-configured scope.","commands":{"allow":[],"deny":["set_overlay_icon"]}},"deny-set-position":{"identifier":"deny-set-position","description":"Denies the set_position command without any pre-configured scope.","commands":{"allow":[],"deny":["set_position"]}},"deny-set-progress-bar":{"identifier":"deny-set-progress-bar","description":"Denies the set_progress_bar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_progress_bar"]}},"deny-set-resizable":{"identifier":"deny-set-resizable","description":"Denies the set_resizable command without any pre-configured scope.","commands":{"allow":[],"deny":["set_resizable"]}},"deny-set-shadow":{"identifier":"deny-set-shadow","description":"Denies the set_shadow command without any pre-configured scope.","commands":{"allow":[],"deny":["set_shadow"]}},"deny-set-size":{"identifier":"deny-set-size","description":"Denies the set_size command without any pre-configured scope.","commands":{"allow":[],"deny":["set_size"]}},"deny-set-size-constraints":{"identifier":"deny-set-size-constraints","description":"Denies the set_size_constraints command without any pre-configured scope.","commands":{"allow":[],"deny":["set_size_constraints"]}},"deny-set-skip-taskbar":{"identifier":"deny-set-skip-taskbar","description":"Denies the set_skip_taskbar command without any pre-configured scope.","commands":{"allow":[],"deny":["set_skip_taskbar"]}},"deny-set-theme":{"identifier":"deny-set-theme","description":"Denies the set_theme command without any pre-configured scope.","commands":{"allow":[],"deny":["set_theme"]}},"deny-set-title":{"identifier":"deny-set-title","description":"Denies the set_title command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title"]}},"deny-set-title-bar-style":{"identifier":"deny-set-title-bar-style","description":"Denies the set_title_bar_style command without any pre-configured scope.","commands":{"allow":[],"deny":["set_title_bar_style"]}},"deny-set-visible-on-all-workspaces":{"identifier":"deny-set-visible-on-all-workspaces","description":"Denies the set_visible_on_all_workspaces command without any pre-configured scope.","commands":{"allow":[],"deny":["set_visible_on_all_workspaces"]}},"deny-show":{"identifier":"deny-show","description":"Denies the show command without any pre-configured scope.","commands":{"allow":[],"deny":["show"]}},"deny-start-dragging":{"identifier":"deny-start-dragging","description":"Denies the start_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_dragging"]}},"deny-start-resize-dragging":{"identifier":"deny-start-resize-dragging","description":"Denies the start_resize_dragging command without any pre-configured scope.","commands":{"allow":[],"deny":["start_resize_dragging"]}},"deny-theme":{"identifier":"deny-theme","description":"Denies the theme command without any pre-configured scope.","commands":{"allow":[],"deny":["theme"]}},"deny-title":{"identifier":"deny-title","description":"Denies the title command without any pre-configured scope.","commands":{"allow":[],"deny":["title"]}},"deny-toggle-maximize":{"identifier":"deny-toggle-maximize","description":"Denies the toggle_maximize command without any pre-configured scope.","commands":{"allow":[],"deny":["toggle_maximize"]}},"deny-unmaximize":{"identifier":"deny-unmaximize","description":"Denies the unmaximize command without any pre-configured scope.","commands":{"allow":[],"deny":["unmaximize"]}},"deny-unminimize":{"identifier":"deny-unminimize","description":"Denies the unminimize command without any pre-configured scope.","commands":{"allow":[],"deny":["unminimize"]}}},"permission_sets":{},"global_scope_schema":null},"http":{"default_permission":{"identifier":"default","description":"This permission set configures what kind of\nfetch operations are available from the http plugin.\n\nThis enables all fetch operations but does not\nallow explicitly any origins to be fetched. This needs to\nbe manually configured before usage.\n\n#### Granted Permissions\n\nAll fetch operations are enabled.\n\n","permissions":["allow-fetch","allow-fetch-cancel","allow-fetch-read-body","allow-fetch-send"]},"permissions":{"allow-fetch":{"identifier":"allow-fetch","description":"Enables the fetch command without any pre-configured scope.","commands":{"allow":["fetch"],"deny":[]}},"allow-fetch-cancel":{"identifier":"allow-fetch-cancel","description":"Enables the fetch_cancel command without any pre-configured scope.","commands":{"allow":["fetch_cancel"],"deny":[]}},"allow-fetch-read-body":{"identifier":"allow-fetch-read-body","description":"Enables the fetch_read_body command without any pre-configured scope.","commands":{"allow":["fetch_read_body"],"deny":[]}},"allow-fetch-send":{"identifier":"allow-fetch-send","description":"Enables the fetch_send command without any pre-configured scope.","commands":{"allow":["fetch_send"],"deny":[]}},"deny-fetch":{"identifier":"deny-fetch","description":"Denies the fetch command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch"]}},"deny-fetch-cancel":{"identifier":"deny-fetch-cancel","description":"Denies the fetch_cancel command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch_cancel"]}},"deny-fetch-read-body":{"identifier":"deny-fetch-read-body","description":"Denies the fetch_read_body command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch_read_body"]}},"deny-fetch-send":{"identifier":"deny-fetch-send","description":"Denies the fetch_send command without any pre-configured scope.","commands":{"allow":[],"deny":["fetch_send"]}}},"permission_sets":{},"global_scope_schema":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"description":"A URL that can be accessed by the webview when using the HTTP APIs. Wildcards can be used following the URL pattern standard.\n\nSee [the URL Pattern spec](https://urlpattern.spec.whatwg.org/) for more information.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin on port 443\n\n- \"https://*:*\" : allows all HTTPS origin on any port\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"","type":"string"},{"properties":{"url":{"description":"A URL that can be accessed by the webview when using the HTTP APIs. Wildcards can be used following the URL pattern standard.\n\nSee [the URL Pattern spec](https://urlpattern.spec.whatwg.org/) for more information.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin on port 443\n\n- \"https://*:*\" : allows all HTTPS origin on any port\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"","type":"string"}},"required":["url"],"type":"object"}],"description":"HTTP scope entry.","title":"HttpScopeEntry"}},"shell":{"default_permission":{"identifier":"default","description":"This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n","permissions":["allow-open"]},"permissions":{"allow-execute":{"identifier":"allow-execute","description":"Enables the execute command without any pre-configured scope.","commands":{"allow":["execute"],"deny":[]}},"allow-kill":{"identifier":"allow-kill","description":"Enables the kill command without any pre-configured scope.","commands":{"allow":["kill"],"deny":[]}},"allow-open":{"identifier":"allow-open","description":"Enables the open command without any pre-configured scope.","commands":{"allow":["open"],"deny":[]}},"allow-spawn":{"identifier":"allow-spawn","description":"Enables the spawn command without any pre-configured scope.","commands":{"allow":["spawn"],"deny":[]}},"allow-stdin-write":{"identifier":"allow-stdin-write","description":"Enables the stdin_write command without any pre-configured scope.","commands":{"allow":["stdin_write"],"deny":[]}},"deny-execute":{"identifier":"deny-execute","description":"Denies the execute command without any pre-configured scope.","commands":{"allow":[],"deny":["execute"]}},"deny-kill":{"identifier":"deny-kill","description":"Denies the kill command without any pre-configured scope.","commands":{"allow":[],"deny":["kill"]}},"deny-open":{"identifier":"deny-open","description":"Denies the open command without any pre-configured scope.","commands":{"allow":[],"deny":["open"]}},"deny-spawn":{"identifier":"deny-spawn","description":"Denies the spawn command without any pre-configured scope.","commands":{"allow":[],"deny":["spawn"]}},"deny-stdin-write":{"identifier":"deny-stdin-write","description":"Denies the stdin_write command without any pre-configured scope.","commands":{"allow":[],"deny":["stdin_write"]}}},"permission_sets":{},"global_scope_schema":{"$schema":"http://json-schema.org/draft-07/schema#","anyOf":[{"additionalProperties":false,"properties":{"args":{"allOf":[{"$ref":"#/definitions/ShellScopeEntryAllowedArgs"}],"description":"The allowed arguments for the command execution."},"cmd":{"description":"The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.","type":"string"},"name":{"description":"The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.","type":"string"}},"required":["cmd","name"],"type":"object"},{"additionalProperties":false,"properties":{"args":{"allOf":[{"$ref":"#/definitions/ShellScopeEntryAllowedArgs"}],"description":"The allowed arguments for the command execution."},"name":{"description":"The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.","type":"string"},"sidecar":{"description":"If this command is a sidecar command.","type":"boolean"}},"required":["name","sidecar"],"type":"object"}],"definitions":{"ShellScopeEntryAllowedArg":{"anyOf":[{"description":"A non-configurable argument that is passed to the command in the order it was specified.","type":"string"},{"additionalProperties":false,"description":"A variable that is set while calling the command from the webview API.","properties":{"raw":{"default":false,"description":"Marks the validator as a raw regex, meaning the plugin should not make any modification at runtime.\n\nThis means the regex will not match on the entire string by default, which might be exploited if your regex allow unexpected input to be considered valid. When using this option, make sure your regex is correct.","type":"boolean"},"validator":{"description":"[regex] validator to require passed values to conform to an expected input.\n\nThis will require the argument value passed to this variable to match the `validator` regex before it will be executed.\n\nThe regex string is by default surrounded by `^...$` to match the full string. For example the `https?://\\w+` regex would be registered as `^https?://\\w+$`.\n\n[regex]: ","type":"string"}},"required":["validator"],"type":"object"}],"description":"A command argument allowed to be executed by the webview API."},"ShellScopeEntryAllowedArgs":{"anyOf":[{"description":"Use a simple boolean to allow all or disable all arguments to this command configuration.","type":"boolean"},{"description":"A specific set of [`ShellScopeEntryAllowedArg`] that are valid to call for the command configuration.","items":{"$ref":"#/definitions/ShellScopeEntryAllowedArg"},"type":"array"}],"description":"A set of command arguments allowed to be executed by the webview API.\n\nA value of `true` will allow any arguments to be passed to the command. `false` will disable all arguments. A list of [`ShellScopeEntryAllowedArg`] will set those arguments as the only valid arguments to be passed to the attached command configuration."}},"description":"Shell scope entry.","title":"ShellScopeEntry"}}} \ No newline at end of file diff --git a/frontend/src-tauri/gen/schemas/capabilities.json b/frontend/src-tauri/gen/schemas/capabilities.json deleted file mode 100644 index d4ec97b548..0000000000 --- a/frontend/src-tauri/gen/schemas/capabilities.json +++ /dev/null @@ -1 +0,0 @@ -{"desktop-capability":{"identifier":"desktop-capability","description":"","local":true,"windows":["main"],"permissions":["http:default"],"platforms":["macOS","windows","linux"]},"migrated":{"identifier":"migrated","description":"permissions that were migrated from v1","local":true,"windows":["main"],"permissions":["core:default","core:window:allow-create","core:window:allow-center","core:window:allow-request-user-attention","core:window:allow-set-resizable","core:window:allow-set-maximizable","core:window:allow-set-minimizable","core:window:allow-set-closable","core:window:allow-set-title","core:window:allow-maximize","core:window:allow-unmaximize","core:window:allow-minimize","core:window:allow-unminimize","core:window:allow-show","core:window:allow-hide","core:window:allow-close","core:window:allow-set-decorations","core:window:allow-set-always-on-top","core:window:allow-set-content-protected","core:window:allow-set-size","core:window:allow-set-min-size","core:window:allow-set-max-size","core:window:allow-set-position","core:window:allow-set-fullscreen","core:window:allow-set-focus","core:window:allow-set-icon","core:window:allow-set-skip-taskbar","core:window:allow-set-cursor-grab","core:window:allow-set-cursor-visible","core:window:allow-set-cursor-icon","core:window:allow-set-cursor-position","core:window:allow-set-ignore-cursor-events","core:window:allow-start-dragging","core:webview:allow-print","shell:allow-execute","shell:allow-open","http:default","core:app:allow-app-show","core:app:allow-app-hide","shell:default","http:default"]}} \ No newline at end of file diff --git a/frontend/src-tauri/gen/schemas/desktop-schema.json b/frontend/src-tauri/gen/schemas/desktop-schema.json deleted file mode 100644 index 5cedd90e1d..0000000000 --- a/frontend/src-tauri/gen/schemas/desktop-schema.json +++ /dev/null @@ -1,2660 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "CapabilityFile", - "description": "Capability formats accepted in a capability file.", - "anyOf": [ - { - "description": "A single capability.", - "allOf": [ - { - "$ref": "#/definitions/Capability" - } - ] - }, - { - "description": "A list of capabilities.", - "type": "array", - "items": { - "$ref": "#/definitions/Capability" - } - }, - { - "description": "A list of capabilities.", - "type": "object", - "required": [ - "capabilities" - ], - "properties": { - "capabilities": { - "description": "The list of capabilities.", - "type": "array", - "items": { - "$ref": "#/definitions/Capability" - } - } - } - } - ], - "definitions": { - "Capability": { - "description": "A grouping and boundary mechanism developers can use to isolate access to the IPC layer.\n\nIt controls application windows' and webviews' fine grained access to the Tauri core, application, or plugin commands. If a webview or its window is not matching any capability then it has no access to the IPC layer at all.\n\nThis can be done to create groups of windows, based on their required system access, which can reduce impact of frontend vulnerabilities in less privileged windows. Windows can be added to a capability by exact name (e.g. `main-window`) or glob patterns like `*` or `admin-*`. A Window can have none, one, or multiple associated capabilities.\n\n## Example\n\n```json { \"identifier\": \"main-user-files-write\", \"description\": \"This capability allows the `main` window on macOS and Windows access to `filesystem` write related commands and `dialog` commands to enable programatic access to files selected by the user.\", \"windows\": [ \"main\" ], \"permissions\": [ \"core:default\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] }, ], \"platforms\": [\"macOS\",\"windows\"] } ```", - "type": "object", - "required": [ - "identifier", - "permissions" - ], - "properties": { - "identifier": { - "description": "Identifier of the capability.\n\n## Example\n\n`main-user-files-write`", - "type": "string" - }, - "description": { - "description": "Description of what the capability is intended to allow on associated windows.\n\nIt should contain a description of what the grouped permissions should allow.\n\n## Example\n\nThis capability allows the `main` window access to `filesystem` write related commands and `dialog` commands to enable programatic access to files selected by the user.", - "default": "", - "type": "string" - }, - "remote": { - "description": "Configure remote URLs that can use the capability permissions.\n\nThis setting is optional and defaults to not being set, as our default use case is that the content is served from our local application.\n\n:::caution Make sure you understand the security implications of providing remote sources with local system access. :::\n\n## Example\n\n```json { \"urls\": [\"https://*.mydomain.dev\"] } ```", - "anyOf": [ - { - "$ref": "#/definitions/CapabilityRemote" - }, - { - "type": "null" - } - ] - }, - "local": { - "description": "Whether this capability is enabled for local app URLs or not. Defaults to `true`.", - "default": true, - "type": "boolean" - }, - "windows": { - "description": "List of windows that are affected by this capability. Can be a glob pattern.\n\nIf a window label matches any of the patterns in this list, the capability will be enabled on all the webviews of that window, regardless of the value of [`Self::webviews`].\n\nOn multiwebview windows, prefer specifying [`Self::webviews`] and omitting [`Self::windows`] for a fine grained access control.\n\n## Example\n\n`[\"main\"]`", - "type": "array", - "items": { - "type": "string" - } - }, - "webviews": { - "description": "List of webviews that are affected by this capability. Can be a glob pattern.\n\nThe capability will be enabled on all the webviews whose label matches any of the patterns in this list, regardless of whether the webview's window label matches a pattern in [`Self::windows`].\n\n## Example\n\n`[\"sub-webview-one\", \"sub-webview-two\"]`", - "type": "array", - "items": { - "type": "string" - } - }, - "permissions": { - "description": "List of permissions attached to this capability.\n\nMust include the plugin name as prefix in the form of `${plugin-name}:${permission-name}`. For commands directly implemented in the application itself only `${permission-name}` is required.\n\n## Example\n\n```json [ \"core:default\", \"shell:allow-open\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] } ] ```", - "type": "array", - "items": { - "$ref": "#/definitions/PermissionEntry" - }, - "uniqueItems": true - }, - "platforms": { - "description": "Limit which target platforms this capability applies to.\n\nBy default all platforms are targeted.\n\n## Example\n\n`[\"macOS\",\"windows\"]`", - "type": [ - "array", - "null" - ], - "items": { - "$ref": "#/definitions/Target" - } - } - } - }, - "CapabilityRemote": { - "description": "Configuration for remote URLs that are associated with the capability.", - "type": "object", - "required": [ - "urls" - ], - "properties": { - "urls": { - "description": "Remote domains this capability refers to using the [URLPattern standard](https://urlpattern.spec.whatwg.org/).\n\n## Examples\n\n- \"https://*.mydomain.dev\": allows subdomains of mydomain.dev - \"https://mydomain.dev/api/*\": allows any subpath of mydomain.dev/api", - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "PermissionEntry": { - "description": "An entry for a permission value in a [`Capability`] can be either a raw permission [`Identifier`] or an object that references a permission and extends its scope.", - "anyOf": [ - { - "description": "Reference a permission or permission set by identifier.", - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ] - }, - { - "description": "Reference a permission or permission set by identifier and extends its scope.", - "type": "object", - "allOf": [ - { - "if": { - "properties": { - "identifier": { - "anyOf": [ - { - "description": "This permission set configures what kind of\nfetch operations are available from the http plugin.\n\nThis enables all fetch operations but does not\nallow explicitly any origins to be fetched. This needs to\nbe manually configured before usage.\n\n#### Granted Permissions\n\nAll fetch operations are enabled.\n\n\n#### This default permission set includes:\n\n- `allow-fetch`\n- `allow-fetch-cancel`\n- `allow-fetch-read-body`\n- `allow-fetch-send`", - "type": "string", - "const": "http:default", - "markdownDescription": "This permission set configures what kind of\nfetch operations are available from the http plugin.\n\nThis enables all fetch operations but does not\nallow explicitly any origins to be fetched. This needs to\nbe manually configured before usage.\n\n#### Granted Permissions\n\nAll fetch operations are enabled.\n\n\n#### This default permission set includes:\n\n- `allow-fetch`\n- `allow-fetch-cancel`\n- `allow-fetch-read-body`\n- `allow-fetch-send`" - }, - { - "description": "Enables the fetch command without any pre-configured scope.", - "type": "string", - "const": "http:allow-fetch", - "markdownDescription": "Enables the fetch command without any pre-configured scope." - }, - { - "description": "Enables the fetch_cancel command without any pre-configured scope.", - "type": "string", - "const": "http:allow-fetch-cancel", - "markdownDescription": "Enables the fetch_cancel command without any pre-configured scope." - }, - { - "description": "Enables the fetch_read_body command without any pre-configured scope.", - "type": "string", - "const": "http:allow-fetch-read-body", - "markdownDescription": "Enables the fetch_read_body command without any pre-configured scope." - }, - { - "description": "Enables the fetch_send command without any pre-configured scope.", - "type": "string", - "const": "http:allow-fetch-send", - "markdownDescription": "Enables the fetch_send command without any pre-configured scope." - }, - { - "description": "Denies the fetch command without any pre-configured scope.", - "type": "string", - "const": "http:deny-fetch", - "markdownDescription": "Denies the fetch command without any pre-configured scope." - }, - { - "description": "Denies the fetch_cancel command without any pre-configured scope.", - "type": "string", - "const": "http:deny-fetch-cancel", - "markdownDescription": "Denies the fetch_cancel command without any pre-configured scope." - }, - { - "description": "Denies the fetch_read_body command without any pre-configured scope.", - "type": "string", - "const": "http:deny-fetch-read-body", - "markdownDescription": "Denies the fetch_read_body command without any pre-configured scope." - }, - { - "description": "Denies the fetch_send command without any pre-configured scope.", - "type": "string", - "const": "http:deny-fetch-send", - "markdownDescription": "Denies the fetch_send command without any pre-configured scope." - } - ] - } - } - }, - "then": { - "properties": { - "allow": { - "items": { - "title": "HttpScopeEntry", - "description": "HTTP scope entry.", - "anyOf": [ - { - "description": "A URL that can be accessed by the webview when using the HTTP APIs. Wildcards can be used following the URL pattern standard.\n\nSee [the URL Pattern spec](https://urlpattern.spec.whatwg.org/) for more information.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin on port 443\n\n- \"https://*:*\" : allows all HTTPS origin on any port\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"", - "type": "string" - }, - { - "type": "object", - "required": [ - "url" - ], - "properties": { - "url": { - "description": "A URL that can be accessed by the webview when using the HTTP APIs. Wildcards can be used following the URL pattern standard.\n\nSee [the URL Pattern spec](https://urlpattern.spec.whatwg.org/) for more information.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin on port 443\n\n- \"https://*:*\" : allows all HTTPS origin on any port\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"", - "type": "string" - } - } - } - ] - } - }, - "deny": { - "items": { - "title": "HttpScopeEntry", - "description": "HTTP scope entry.", - "anyOf": [ - { - "description": "A URL that can be accessed by the webview when using the HTTP APIs. Wildcards can be used following the URL pattern standard.\n\nSee [the URL Pattern spec](https://urlpattern.spec.whatwg.org/) for more information.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin on port 443\n\n- \"https://*:*\" : allows all HTTPS origin on any port\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"", - "type": "string" - }, - { - "type": "object", - "required": [ - "url" - ], - "properties": { - "url": { - "description": "A URL that can be accessed by the webview when using the HTTP APIs. Wildcards can be used following the URL pattern standard.\n\nSee [the URL Pattern spec](https://urlpattern.spec.whatwg.org/) for more information.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin on port 443\n\n- \"https://*:*\" : allows all HTTPS origin on any port\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"", - "type": "string" - } - } - } - ] - } - } - } - }, - "properties": { - "identifier": { - "description": "Identifier of the permission or permission set.", - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ] - } - } - }, - { - "if": { - "properties": { - "identifier": { - "anyOf": [ - { - "description": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`", - "type": "string", - "const": "shell:default", - "markdownDescription": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`" - }, - { - "description": "Enables the execute command without any pre-configured scope.", - "type": "string", - "const": "shell:allow-execute", - "markdownDescription": "Enables the execute command without any pre-configured scope." - }, - { - "description": "Enables the kill command without any pre-configured scope.", - "type": "string", - "const": "shell:allow-kill", - "markdownDescription": "Enables the kill command without any pre-configured scope." - }, - { - "description": "Enables the open command without any pre-configured scope.", - "type": "string", - "const": "shell:allow-open", - "markdownDescription": "Enables the open command without any pre-configured scope." - }, - { - "description": "Enables the spawn command without any pre-configured scope.", - "type": "string", - "const": "shell:allow-spawn", - "markdownDescription": "Enables the spawn command without any pre-configured scope." - }, - { - "description": "Enables the stdin_write command without any pre-configured scope.", - "type": "string", - "const": "shell:allow-stdin-write", - "markdownDescription": "Enables the stdin_write command without any pre-configured scope." - }, - { - "description": "Denies the execute command without any pre-configured scope.", - "type": "string", - "const": "shell:deny-execute", - "markdownDescription": "Denies the execute command without any pre-configured scope." - }, - { - "description": "Denies the kill command without any pre-configured scope.", - "type": "string", - "const": "shell:deny-kill", - "markdownDescription": "Denies the kill command without any pre-configured scope." - }, - { - "description": "Denies the open command without any pre-configured scope.", - "type": "string", - "const": "shell:deny-open", - "markdownDescription": "Denies the open command without any pre-configured scope." - }, - { - "description": "Denies the spawn command without any pre-configured scope.", - "type": "string", - "const": "shell:deny-spawn", - "markdownDescription": "Denies the spawn command without any pre-configured scope." - }, - { - "description": "Denies the stdin_write command without any pre-configured scope.", - "type": "string", - "const": "shell:deny-stdin-write", - "markdownDescription": "Denies the stdin_write command without any pre-configured scope." - } - ] - } - } - }, - "then": { - "properties": { - "allow": { - "items": { - "title": "ShellScopeEntry", - "description": "Shell scope entry.", - "anyOf": [ - { - "type": "object", - "required": [ - "cmd", - "name" - ], - "properties": { - "args": { - "description": "The allowed arguments for the command execution.", - "allOf": [ - { - "$ref": "#/definitions/ShellScopeEntryAllowedArgs" - } - ] - }, - "cmd": { - "description": "The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", - "type": "string" - }, - "name": { - "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", - "type": "string" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "name", - "sidecar" - ], - "properties": { - "args": { - "description": "The allowed arguments for the command execution.", - "allOf": [ - { - "$ref": "#/definitions/ShellScopeEntryAllowedArgs" - } - ] - }, - "name": { - "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", - "type": "string" - }, - "sidecar": { - "description": "If this command is a sidecar command.", - "type": "boolean" - } - }, - "additionalProperties": false - } - ] - } - }, - "deny": { - "items": { - "title": "ShellScopeEntry", - "description": "Shell scope entry.", - "anyOf": [ - { - "type": "object", - "required": [ - "cmd", - "name" - ], - "properties": { - "args": { - "description": "The allowed arguments for the command execution.", - "allOf": [ - { - "$ref": "#/definitions/ShellScopeEntryAllowedArgs" - } - ] - }, - "cmd": { - "description": "The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", - "type": "string" - }, - "name": { - "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", - "type": "string" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "name", - "sidecar" - ], - "properties": { - "args": { - "description": "The allowed arguments for the command execution.", - "allOf": [ - { - "$ref": "#/definitions/ShellScopeEntryAllowedArgs" - } - ] - }, - "name": { - "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", - "type": "string" - }, - "sidecar": { - "description": "If this command is a sidecar command.", - "type": "boolean" - } - }, - "additionalProperties": false - } - ] - } - } - } - }, - "properties": { - "identifier": { - "description": "Identifier of the permission or permission set.", - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ] - } - } - }, - { - "properties": { - "identifier": { - "description": "Identifier of the permission or permission set.", - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ] - }, - "allow": { - "description": "Data that defines what is allowed by the scope.", - "type": [ - "array", - "null" - ], - "items": { - "$ref": "#/definitions/Value" - } - }, - "deny": { - "description": "Data that defines what is denied by the scope. This should be prioritized by validation logic.", - "type": [ - "array", - "null" - ], - "items": { - "$ref": "#/definitions/Value" - } - } - } - } - ], - "required": [ - "identifier" - ] - } - ] - }, - "Identifier": { - "description": "Permission identifier", - "oneOf": [ - { - "description": "Default core plugins set.\n#### This default permission set includes:\n\n- `core:path:default`\n- `core:event:default`\n- `core:window:default`\n- `core:webview:default`\n- `core:app:default`\n- `core:image:default`\n- `core:resources:default`\n- `core:menu:default`\n- `core:tray:default`", - "type": "string", - "const": "core:default", - "markdownDescription": "Default core plugins set.\n#### This default permission set includes:\n\n- `core:path:default`\n- `core:event:default`\n- `core:window:default`\n- `core:webview:default`\n- `core:app:default`\n- `core:image:default`\n- `core:resources:default`\n- `core:menu:default`\n- `core:tray:default`" - }, - { - "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-version`\n- `allow-name`\n- `allow-tauri-version`\n- `allow-identifier`", - "type": "string", - "const": "core:app:default", - "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-version`\n- `allow-name`\n- `allow-tauri-version`\n- `allow-identifier`" - }, - { - "description": "Enables the app_hide command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-app-hide", - "markdownDescription": "Enables the app_hide command without any pre-configured scope." - }, - { - "description": "Enables the app_show command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-app-show", - "markdownDescription": "Enables the app_show command without any pre-configured scope." - }, - { - "description": "Enables the default_window_icon command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-default-window-icon", - "markdownDescription": "Enables the default_window_icon command without any pre-configured scope." - }, - { - "description": "Enables the fetch_data_store_identifiers command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-fetch-data-store-identifiers", - "markdownDescription": "Enables the fetch_data_store_identifiers command without any pre-configured scope." - }, - { - "description": "Enables the identifier command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-identifier", - "markdownDescription": "Enables the identifier command without any pre-configured scope." - }, - { - "description": "Enables the name command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-name", - "markdownDescription": "Enables the name command without any pre-configured scope." - }, - { - "description": "Enables the remove_data_store command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-remove-data-store", - "markdownDescription": "Enables the remove_data_store command without any pre-configured scope." - }, - { - "description": "Enables the set_app_theme command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-set-app-theme", - "markdownDescription": "Enables the set_app_theme command without any pre-configured scope." - }, - { - "description": "Enables the tauri_version command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-tauri-version", - "markdownDescription": "Enables the tauri_version command without any pre-configured scope." - }, - { - "description": "Enables the version command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-version", - "markdownDescription": "Enables the version command without any pre-configured scope." - }, - { - "description": "Denies the app_hide command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-app-hide", - "markdownDescription": "Denies the app_hide command without any pre-configured scope." - }, - { - "description": "Denies the app_show command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-app-show", - "markdownDescription": "Denies the app_show command without any pre-configured scope." - }, - { - "description": "Denies the default_window_icon command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-default-window-icon", - "markdownDescription": "Denies the default_window_icon command without any pre-configured scope." - }, - { - "description": "Denies the fetch_data_store_identifiers command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-fetch-data-store-identifiers", - "markdownDescription": "Denies the fetch_data_store_identifiers command without any pre-configured scope." - }, - { - "description": "Denies the identifier command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-identifier", - "markdownDescription": "Denies the identifier command without any pre-configured scope." - }, - { - "description": "Denies the name command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-name", - "markdownDescription": "Denies the name command without any pre-configured scope." - }, - { - "description": "Denies the remove_data_store command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-remove-data-store", - "markdownDescription": "Denies the remove_data_store command without any pre-configured scope." - }, - { - "description": "Denies the set_app_theme command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-set-app-theme", - "markdownDescription": "Denies the set_app_theme command without any pre-configured scope." - }, - { - "description": "Denies the tauri_version command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-tauri-version", - "markdownDescription": "Denies the tauri_version command without any pre-configured scope." - }, - { - "description": "Denies the version command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-version", - "markdownDescription": "Denies the version command without any pre-configured scope." - }, - { - "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-listen`\n- `allow-unlisten`\n- `allow-emit`\n- `allow-emit-to`", - "type": "string", - "const": "core:event:default", - "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-listen`\n- `allow-unlisten`\n- `allow-emit`\n- `allow-emit-to`" - }, - { - "description": "Enables the emit command without any pre-configured scope.", - "type": "string", - "const": "core:event:allow-emit", - "markdownDescription": "Enables the emit command without any pre-configured scope." - }, - { - "description": "Enables the emit_to command without any pre-configured scope.", - "type": "string", - "const": "core:event:allow-emit-to", - "markdownDescription": "Enables the emit_to command without any pre-configured scope." - }, - { - "description": "Enables the listen command without any pre-configured scope.", - "type": "string", - "const": "core:event:allow-listen", - "markdownDescription": "Enables the listen command without any pre-configured scope." - }, - { - "description": "Enables the unlisten command without any pre-configured scope.", - "type": "string", - "const": "core:event:allow-unlisten", - "markdownDescription": "Enables the unlisten command without any pre-configured scope." - }, - { - "description": "Denies the emit command without any pre-configured scope.", - "type": "string", - "const": "core:event:deny-emit", - "markdownDescription": "Denies the emit command without any pre-configured scope." - }, - { - "description": "Denies the emit_to command without any pre-configured scope.", - "type": "string", - "const": "core:event:deny-emit-to", - "markdownDescription": "Denies the emit_to command without any pre-configured scope." - }, - { - "description": "Denies the listen command without any pre-configured scope.", - "type": "string", - "const": "core:event:deny-listen", - "markdownDescription": "Denies the listen command without any pre-configured scope." - }, - { - "description": "Denies the unlisten command without any pre-configured scope.", - "type": "string", - "const": "core:event:deny-unlisten", - "markdownDescription": "Denies the unlisten command without any pre-configured scope." - }, - { - "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-from-bytes`\n- `allow-from-path`\n- `allow-rgba`\n- `allow-size`", - "type": "string", - "const": "core:image:default", - "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-from-bytes`\n- `allow-from-path`\n- `allow-rgba`\n- `allow-size`" - }, - { - "description": "Enables the from_bytes command without any pre-configured scope.", - "type": "string", - "const": "core:image:allow-from-bytes", - "markdownDescription": "Enables the from_bytes command without any pre-configured scope." - }, - { - "description": "Enables the from_path command without any pre-configured scope.", - "type": "string", - "const": "core:image:allow-from-path", - "markdownDescription": "Enables the from_path command without any pre-configured scope." - }, - { - "description": "Enables the new command without any pre-configured scope.", - "type": "string", - "const": "core:image:allow-new", - "markdownDescription": "Enables the new command without any pre-configured scope." - }, - { - "description": "Enables the rgba command without any pre-configured scope.", - "type": "string", - "const": "core:image:allow-rgba", - "markdownDescription": "Enables the rgba command without any pre-configured scope." - }, - { - "description": "Enables the size command without any pre-configured scope.", - "type": "string", - "const": "core:image:allow-size", - "markdownDescription": "Enables the size command without any pre-configured scope." - }, - { - "description": "Denies the from_bytes command without any pre-configured scope.", - "type": "string", - "const": "core:image:deny-from-bytes", - "markdownDescription": "Denies the from_bytes command without any pre-configured scope." - }, - { - "description": "Denies the from_path command without any pre-configured scope.", - "type": "string", - "const": "core:image:deny-from-path", - "markdownDescription": "Denies the from_path command without any pre-configured scope." - }, - { - "description": "Denies the new command without any pre-configured scope.", - "type": "string", - "const": "core:image:deny-new", - "markdownDescription": "Denies the new command without any pre-configured scope." - }, - { - "description": "Denies the rgba command without any pre-configured scope.", - "type": "string", - "const": "core:image:deny-rgba", - "markdownDescription": "Denies the rgba command without any pre-configured scope." - }, - { - "description": "Denies the size command without any pre-configured scope.", - "type": "string", - "const": "core:image:deny-size", - "markdownDescription": "Denies the size command without any pre-configured scope." - }, - { - "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-append`\n- `allow-prepend`\n- `allow-insert`\n- `allow-remove`\n- `allow-remove-at`\n- `allow-items`\n- `allow-get`\n- `allow-popup`\n- `allow-create-default`\n- `allow-set-as-app-menu`\n- `allow-set-as-window-menu`\n- `allow-text`\n- `allow-set-text`\n- `allow-is-enabled`\n- `allow-set-enabled`\n- `allow-set-accelerator`\n- `allow-set-as-windows-menu-for-nsapp`\n- `allow-set-as-help-menu-for-nsapp`\n- `allow-is-checked`\n- `allow-set-checked`\n- `allow-set-icon`", - "type": "string", - "const": "core:menu:default", - "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-append`\n- `allow-prepend`\n- `allow-insert`\n- `allow-remove`\n- `allow-remove-at`\n- `allow-items`\n- `allow-get`\n- `allow-popup`\n- `allow-create-default`\n- `allow-set-as-app-menu`\n- `allow-set-as-window-menu`\n- `allow-text`\n- `allow-set-text`\n- `allow-is-enabled`\n- `allow-set-enabled`\n- `allow-set-accelerator`\n- `allow-set-as-windows-menu-for-nsapp`\n- `allow-set-as-help-menu-for-nsapp`\n- `allow-is-checked`\n- `allow-set-checked`\n- `allow-set-icon`" - }, - { - "description": "Enables the append command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-append", - "markdownDescription": "Enables the append command without any pre-configured scope." - }, - { - "description": "Enables the create_default command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-create-default", - "markdownDescription": "Enables the create_default command without any pre-configured scope." - }, - { - "description": "Enables the get command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-get", - "markdownDescription": "Enables the get command without any pre-configured scope." - }, - { - "description": "Enables the insert command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-insert", - "markdownDescription": "Enables the insert command without any pre-configured scope." - }, - { - "description": "Enables the is_checked command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-is-checked", - "markdownDescription": "Enables the is_checked command without any pre-configured scope." - }, - { - "description": "Enables the is_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-is-enabled", - "markdownDescription": "Enables the is_enabled command without any pre-configured scope." - }, - { - "description": "Enables the items command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-items", - "markdownDescription": "Enables the items command without any pre-configured scope." - }, - { - "description": "Enables the new command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-new", - "markdownDescription": "Enables the new command without any pre-configured scope." - }, - { - "description": "Enables the popup command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-popup", - "markdownDescription": "Enables the popup command without any pre-configured scope." - }, - { - "description": "Enables the prepend command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-prepend", - "markdownDescription": "Enables the prepend command without any pre-configured scope." - }, - { - "description": "Enables the remove command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-remove", - "markdownDescription": "Enables the remove command without any pre-configured scope." - }, - { - "description": "Enables the remove_at command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-remove-at", - "markdownDescription": "Enables the remove_at command without any pre-configured scope." - }, - { - "description": "Enables the set_accelerator command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-accelerator", - "markdownDescription": "Enables the set_accelerator command without any pre-configured scope." - }, - { - "description": "Enables the set_as_app_menu command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-as-app-menu", - "markdownDescription": "Enables the set_as_app_menu command without any pre-configured scope." - }, - { - "description": "Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-as-help-menu-for-nsapp", - "markdownDescription": "Enables the set_as_help_menu_for_nsapp command without any pre-configured scope." - }, - { - "description": "Enables the set_as_window_menu command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-as-window-menu", - "markdownDescription": "Enables the set_as_window_menu command without any pre-configured scope." - }, - { - "description": "Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-as-windows-menu-for-nsapp", - "markdownDescription": "Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope." - }, - { - "description": "Enables the set_checked command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-checked", - "markdownDescription": "Enables the set_checked command without any pre-configured scope." - }, - { - "description": "Enables the set_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-enabled", - "markdownDescription": "Enables the set_enabled command without any pre-configured scope." - }, - { - "description": "Enables the set_icon command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-icon", - "markdownDescription": "Enables the set_icon command without any pre-configured scope." - }, - { - "description": "Enables the set_text command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-text", - "markdownDescription": "Enables the set_text command without any pre-configured scope." - }, - { - "description": "Enables the text command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-text", - "markdownDescription": "Enables the text command without any pre-configured scope." - }, - { - "description": "Denies the append command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-append", - "markdownDescription": "Denies the append command without any pre-configured scope." - }, - { - "description": "Denies the create_default command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-create-default", - "markdownDescription": "Denies the create_default command without any pre-configured scope." - }, - { - "description": "Denies the get command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-get", - "markdownDescription": "Denies the get command without any pre-configured scope." - }, - { - "description": "Denies the insert command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-insert", - "markdownDescription": "Denies the insert command without any pre-configured scope." - }, - { - "description": "Denies the is_checked command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-is-checked", - "markdownDescription": "Denies the is_checked command without any pre-configured scope." - }, - { - "description": "Denies the is_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-is-enabled", - "markdownDescription": "Denies the is_enabled command without any pre-configured scope." - }, - { - "description": "Denies the items command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-items", - "markdownDescription": "Denies the items command without any pre-configured scope." - }, - { - "description": "Denies the new command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-new", - "markdownDescription": "Denies the new command without any pre-configured scope." - }, - { - "description": "Denies the popup command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-popup", - "markdownDescription": "Denies the popup command without any pre-configured scope." - }, - { - "description": "Denies the prepend command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-prepend", - "markdownDescription": "Denies the prepend command without any pre-configured scope." - }, - { - "description": "Denies the remove command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-remove", - "markdownDescription": "Denies the remove command without any pre-configured scope." - }, - { - "description": "Denies the remove_at command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-remove-at", - "markdownDescription": "Denies the remove_at command without any pre-configured scope." - }, - { - "description": "Denies the set_accelerator command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-accelerator", - "markdownDescription": "Denies the set_accelerator command without any pre-configured scope." - }, - { - "description": "Denies the set_as_app_menu command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-as-app-menu", - "markdownDescription": "Denies the set_as_app_menu command without any pre-configured scope." - }, - { - "description": "Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-as-help-menu-for-nsapp", - "markdownDescription": "Denies the set_as_help_menu_for_nsapp command without any pre-configured scope." - }, - { - "description": "Denies the set_as_window_menu command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-as-window-menu", - "markdownDescription": "Denies the set_as_window_menu command without any pre-configured scope." - }, - { - "description": "Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-as-windows-menu-for-nsapp", - "markdownDescription": "Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope." - }, - { - "description": "Denies the set_checked command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-checked", - "markdownDescription": "Denies the set_checked command without any pre-configured scope." - }, - { - "description": "Denies the set_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-enabled", - "markdownDescription": "Denies the set_enabled command without any pre-configured scope." - }, - { - "description": "Denies the set_icon command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-icon", - "markdownDescription": "Denies the set_icon command without any pre-configured scope." - }, - { - "description": "Denies the set_text command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-text", - "markdownDescription": "Denies the set_text command without any pre-configured scope." - }, - { - "description": "Denies the text command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-text", - "markdownDescription": "Denies the text command without any pre-configured scope." - }, - { - "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-resolve-directory`\n- `allow-resolve`\n- `allow-normalize`\n- `allow-join`\n- `allow-dirname`\n- `allow-extname`\n- `allow-basename`\n- `allow-is-absolute`", - "type": "string", - "const": "core:path:default", - "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-resolve-directory`\n- `allow-resolve`\n- `allow-normalize`\n- `allow-join`\n- `allow-dirname`\n- `allow-extname`\n- `allow-basename`\n- `allow-is-absolute`" - }, - { - "description": "Enables the basename command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-basename", - "markdownDescription": "Enables the basename command without any pre-configured scope." - }, - { - "description": "Enables the dirname command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-dirname", - "markdownDescription": "Enables the dirname command without any pre-configured scope." - }, - { - "description": "Enables the extname command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-extname", - "markdownDescription": "Enables the extname command without any pre-configured scope." - }, - { - "description": "Enables the is_absolute command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-is-absolute", - "markdownDescription": "Enables the is_absolute command without any pre-configured scope." - }, - { - "description": "Enables the join command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-join", - "markdownDescription": "Enables the join command without any pre-configured scope." - }, - { - "description": "Enables the normalize command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-normalize", - "markdownDescription": "Enables the normalize command without any pre-configured scope." - }, - { - "description": "Enables the resolve command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-resolve", - "markdownDescription": "Enables the resolve command without any pre-configured scope." - }, - { - "description": "Enables the resolve_directory command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-resolve-directory", - "markdownDescription": "Enables the resolve_directory command without any pre-configured scope." - }, - { - "description": "Denies the basename command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-basename", - "markdownDescription": "Denies the basename command without any pre-configured scope." - }, - { - "description": "Denies the dirname command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-dirname", - "markdownDescription": "Denies the dirname command without any pre-configured scope." - }, - { - "description": "Denies the extname command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-extname", - "markdownDescription": "Denies the extname command without any pre-configured scope." - }, - { - "description": "Denies the is_absolute command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-is-absolute", - "markdownDescription": "Denies the is_absolute command without any pre-configured scope." - }, - { - "description": "Denies the join command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-join", - "markdownDescription": "Denies the join command without any pre-configured scope." - }, - { - "description": "Denies the normalize command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-normalize", - "markdownDescription": "Denies the normalize command without any pre-configured scope." - }, - { - "description": "Denies the resolve command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-resolve", - "markdownDescription": "Denies the resolve command without any pre-configured scope." - }, - { - "description": "Denies the resolve_directory command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-resolve-directory", - "markdownDescription": "Denies the resolve_directory command without any pre-configured scope." - }, - { - "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-close`", - "type": "string", - "const": "core:resources:default", - "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-close`" - }, - { - "description": "Enables the close command without any pre-configured scope.", - "type": "string", - "const": "core:resources:allow-close", - "markdownDescription": "Enables the close command without any pre-configured scope." - }, - { - "description": "Denies the close command without any pre-configured scope.", - "type": "string", - "const": "core:resources:deny-close", - "markdownDescription": "Denies the close command without any pre-configured scope." - }, - { - "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-get-by-id`\n- `allow-remove-by-id`\n- `allow-set-icon`\n- `allow-set-menu`\n- `allow-set-tooltip`\n- `allow-set-title`\n- `allow-set-visible`\n- `allow-set-temp-dir-path`\n- `allow-set-icon-as-template`\n- `allow-set-show-menu-on-left-click`", - "type": "string", - "const": "core:tray:default", - "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-get-by-id`\n- `allow-remove-by-id`\n- `allow-set-icon`\n- `allow-set-menu`\n- `allow-set-tooltip`\n- `allow-set-title`\n- `allow-set-visible`\n- `allow-set-temp-dir-path`\n- `allow-set-icon-as-template`\n- `allow-set-show-menu-on-left-click`" - }, - { - "description": "Enables the get_by_id command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-get-by-id", - "markdownDescription": "Enables the get_by_id command without any pre-configured scope." - }, - { - "description": "Enables the new command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-new", - "markdownDescription": "Enables the new command without any pre-configured scope." - }, - { - "description": "Enables the remove_by_id command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-remove-by-id", - "markdownDescription": "Enables the remove_by_id command without any pre-configured scope." - }, - { - "description": "Enables the set_icon command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-icon", - "markdownDescription": "Enables the set_icon command without any pre-configured scope." - }, - { - "description": "Enables the set_icon_as_template command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-icon-as-template", - "markdownDescription": "Enables the set_icon_as_template command without any pre-configured scope." - }, - { - "description": "Enables the set_menu command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-menu", - "markdownDescription": "Enables the set_menu command without any pre-configured scope." - }, - { - "description": "Enables the set_show_menu_on_left_click command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-show-menu-on-left-click", - "markdownDescription": "Enables the set_show_menu_on_left_click command without any pre-configured scope." - }, - { - "description": "Enables the set_temp_dir_path command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-temp-dir-path", - "markdownDescription": "Enables the set_temp_dir_path command without any pre-configured scope." - }, - { - "description": "Enables the set_title command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-title", - "markdownDescription": "Enables the set_title command without any pre-configured scope." - }, - { - "description": "Enables the set_tooltip command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-tooltip", - "markdownDescription": "Enables the set_tooltip command without any pre-configured scope." - }, - { - "description": "Enables the set_visible command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-visible", - "markdownDescription": "Enables the set_visible command without any pre-configured scope." - }, - { - "description": "Denies the get_by_id command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-get-by-id", - "markdownDescription": "Denies the get_by_id command without any pre-configured scope." - }, - { - "description": "Denies the new command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-new", - "markdownDescription": "Denies the new command without any pre-configured scope." - }, - { - "description": "Denies the remove_by_id command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-remove-by-id", - "markdownDescription": "Denies the remove_by_id command without any pre-configured scope." - }, - { - "description": "Denies the set_icon command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-icon", - "markdownDescription": "Denies the set_icon command without any pre-configured scope." - }, - { - "description": "Denies the set_icon_as_template command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-icon-as-template", - "markdownDescription": "Denies the set_icon_as_template command without any pre-configured scope." - }, - { - "description": "Denies the set_menu command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-menu", - "markdownDescription": "Denies the set_menu command without any pre-configured scope." - }, - { - "description": "Denies the set_show_menu_on_left_click command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-show-menu-on-left-click", - "markdownDescription": "Denies the set_show_menu_on_left_click command without any pre-configured scope." - }, - { - "description": "Denies the set_temp_dir_path command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-temp-dir-path", - "markdownDescription": "Denies the set_temp_dir_path command without any pre-configured scope." - }, - { - "description": "Denies the set_title command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-title", - "markdownDescription": "Denies the set_title command without any pre-configured scope." - }, - { - "description": "Denies the set_tooltip command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-tooltip", - "markdownDescription": "Denies the set_tooltip command without any pre-configured scope." - }, - { - "description": "Denies the set_visible command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-visible", - "markdownDescription": "Denies the set_visible command without any pre-configured scope." - }, - { - "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-webviews`\n- `allow-webview-position`\n- `allow-webview-size`\n- `allow-internal-toggle-devtools`", - "type": "string", - "const": "core:webview:default", - "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-webviews`\n- `allow-webview-position`\n- `allow-webview-size`\n- `allow-internal-toggle-devtools`" - }, - { - "description": "Enables the clear_all_browsing_data command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-clear-all-browsing-data", - "markdownDescription": "Enables the clear_all_browsing_data command without any pre-configured scope." - }, - { - "description": "Enables the create_webview command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-create-webview", - "markdownDescription": "Enables the create_webview command without any pre-configured scope." - }, - { - "description": "Enables the create_webview_window command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-create-webview-window", - "markdownDescription": "Enables the create_webview_window command without any pre-configured scope." - }, - { - "description": "Enables the get_all_webviews command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-get-all-webviews", - "markdownDescription": "Enables the get_all_webviews command without any pre-configured scope." - }, - { - "description": "Enables the internal_toggle_devtools command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-internal-toggle-devtools", - "markdownDescription": "Enables the internal_toggle_devtools command without any pre-configured scope." - }, - { - "description": "Enables the print command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-print", - "markdownDescription": "Enables the print command without any pre-configured scope." - }, - { - "description": "Enables the reparent command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-reparent", - "markdownDescription": "Enables the reparent command without any pre-configured scope." - }, - { - "description": "Enables the set_webview_background_color command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-set-webview-background-color", - "markdownDescription": "Enables the set_webview_background_color command without any pre-configured scope." - }, - { - "description": "Enables the set_webview_focus command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-set-webview-focus", - "markdownDescription": "Enables the set_webview_focus command without any pre-configured scope." - }, - { - "description": "Enables the set_webview_position command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-set-webview-position", - "markdownDescription": "Enables the set_webview_position command without any pre-configured scope." - }, - { - "description": "Enables the set_webview_size command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-set-webview-size", - "markdownDescription": "Enables the set_webview_size command without any pre-configured scope." - }, - { - "description": "Enables the set_webview_zoom command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-set-webview-zoom", - "markdownDescription": "Enables the set_webview_zoom command without any pre-configured scope." - }, - { - "description": "Enables the webview_close command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-webview-close", - "markdownDescription": "Enables the webview_close command without any pre-configured scope." - }, - { - "description": "Enables the webview_hide command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-webview-hide", - "markdownDescription": "Enables the webview_hide command without any pre-configured scope." - }, - { - "description": "Enables the webview_position command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-webview-position", - "markdownDescription": "Enables the webview_position command without any pre-configured scope." - }, - { - "description": "Enables the webview_show command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-webview-show", - "markdownDescription": "Enables the webview_show command without any pre-configured scope." - }, - { - "description": "Enables the webview_size command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-webview-size", - "markdownDescription": "Enables the webview_size command without any pre-configured scope." - }, - { - "description": "Denies the clear_all_browsing_data command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-clear-all-browsing-data", - "markdownDescription": "Denies the clear_all_browsing_data command without any pre-configured scope." - }, - { - "description": "Denies the create_webview command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-create-webview", - "markdownDescription": "Denies the create_webview command without any pre-configured scope." - }, - { - "description": "Denies the create_webview_window command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-create-webview-window", - "markdownDescription": "Denies the create_webview_window command without any pre-configured scope." - }, - { - "description": "Denies the get_all_webviews command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-get-all-webviews", - "markdownDescription": "Denies the get_all_webviews command without any pre-configured scope." - }, - { - "description": "Denies the internal_toggle_devtools command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-internal-toggle-devtools", - "markdownDescription": "Denies the internal_toggle_devtools command without any pre-configured scope." - }, - { - "description": "Denies the print command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-print", - "markdownDescription": "Denies the print command without any pre-configured scope." - }, - { - "description": "Denies the reparent command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-reparent", - "markdownDescription": "Denies the reparent command without any pre-configured scope." - }, - { - "description": "Denies the set_webview_background_color command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-set-webview-background-color", - "markdownDescription": "Denies the set_webview_background_color command without any pre-configured scope." - }, - { - "description": "Denies the set_webview_focus command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-set-webview-focus", - "markdownDescription": "Denies the set_webview_focus command without any pre-configured scope." - }, - { - "description": "Denies the set_webview_position command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-set-webview-position", - "markdownDescription": "Denies the set_webview_position command without any pre-configured scope." - }, - { - "description": "Denies the set_webview_size command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-set-webview-size", - "markdownDescription": "Denies the set_webview_size command without any pre-configured scope." - }, - { - "description": "Denies the set_webview_zoom command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-set-webview-zoom", - "markdownDescription": "Denies the set_webview_zoom command without any pre-configured scope." - }, - { - "description": "Denies the webview_close command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-webview-close", - "markdownDescription": "Denies the webview_close command without any pre-configured scope." - }, - { - "description": "Denies the webview_hide command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-webview-hide", - "markdownDescription": "Denies the webview_hide command without any pre-configured scope." - }, - { - "description": "Denies the webview_position command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-webview-position", - "markdownDescription": "Denies the webview_position command without any pre-configured scope." - }, - { - "description": "Denies the webview_show command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-webview-show", - "markdownDescription": "Denies the webview_show command without any pre-configured scope." - }, - { - "description": "Denies the webview_size command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-webview-size", - "markdownDescription": "Denies the webview_size command without any pre-configured scope." - }, - { - "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-windows`\n- `allow-scale-factor`\n- `allow-inner-position`\n- `allow-outer-position`\n- `allow-inner-size`\n- `allow-outer-size`\n- `allow-is-fullscreen`\n- `allow-is-minimized`\n- `allow-is-maximized`\n- `allow-is-focused`\n- `allow-is-decorated`\n- `allow-is-resizable`\n- `allow-is-maximizable`\n- `allow-is-minimizable`\n- `allow-is-closable`\n- `allow-is-visible`\n- `allow-is-enabled`\n- `allow-title`\n- `allow-current-monitor`\n- `allow-primary-monitor`\n- `allow-monitor-from-point`\n- `allow-available-monitors`\n- `allow-cursor-position`\n- `allow-theme`\n- `allow-is-always-on-top`\n- `allow-internal-toggle-maximize`", - "type": "string", - "const": "core:window:default", - "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-windows`\n- `allow-scale-factor`\n- `allow-inner-position`\n- `allow-outer-position`\n- `allow-inner-size`\n- `allow-outer-size`\n- `allow-is-fullscreen`\n- `allow-is-minimized`\n- `allow-is-maximized`\n- `allow-is-focused`\n- `allow-is-decorated`\n- `allow-is-resizable`\n- `allow-is-maximizable`\n- `allow-is-minimizable`\n- `allow-is-closable`\n- `allow-is-visible`\n- `allow-is-enabled`\n- `allow-title`\n- `allow-current-monitor`\n- `allow-primary-monitor`\n- `allow-monitor-from-point`\n- `allow-available-monitors`\n- `allow-cursor-position`\n- `allow-theme`\n- `allow-is-always-on-top`\n- `allow-internal-toggle-maximize`" - }, - { - "description": "Enables the available_monitors command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-available-monitors", - "markdownDescription": "Enables the available_monitors command without any pre-configured scope." - }, - { - "description": "Enables the center command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-center", - "markdownDescription": "Enables the center command without any pre-configured scope." - }, - { - "description": "Enables the close command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-close", - "markdownDescription": "Enables the close command without any pre-configured scope." - }, - { - "description": "Enables the create command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-create", - "markdownDescription": "Enables the create command without any pre-configured scope." - }, - { - "description": "Enables the current_monitor command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-current-monitor", - "markdownDescription": "Enables the current_monitor command without any pre-configured scope." - }, - { - "description": "Enables the cursor_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-cursor-position", - "markdownDescription": "Enables the cursor_position command without any pre-configured scope." - }, - { - "description": "Enables the destroy command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-destroy", - "markdownDescription": "Enables the destroy command without any pre-configured scope." - }, - { - "description": "Enables the get_all_windows command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-get-all-windows", - "markdownDescription": "Enables the get_all_windows command without any pre-configured scope." - }, - { - "description": "Enables the hide command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-hide", - "markdownDescription": "Enables the hide command without any pre-configured scope." - }, - { - "description": "Enables the inner_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-inner-position", - "markdownDescription": "Enables the inner_position command without any pre-configured scope." - }, - { - "description": "Enables the inner_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-inner-size", - "markdownDescription": "Enables the inner_size command without any pre-configured scope." - }, - { - "description": "Enables the internal_toggle_maximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-internal-toggle-maximize", - "markdownDescription": "Enables the internal_toggle_maximize command without any pre-configured scope." - }, - { - "description": "Enables the is_always_on_top command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-always-on-top", - "markdownDescription": "Enables the is_always_on_top command without any pre-configured scope." - }, - { - "description": "Enables the is_closable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-closable", - "markdownDescription": "Enables the is_closable command without any pre-configured scope." - }, - { - "description": "Enables the is_decorated command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-decorated", - "markdownDescription": "Enables the is_decorated command without any pre-configured scope." - }, - { - "description": "Enables the is_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-enabled", - "markdownDescription": "Enables the is_enabled command without any pre-configured scope." - }, - { - "description": "Enables the is_focused command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-focused", - "markdownDescription": "Enables the is_focused command without any pre-configured scope." - }, - { - "description": "Enables the is_fullscreen command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-fullscreen", - "markdownDescription": "Enables the is_fullscreen command without any pre-configured scope." - }, - { - "description": "Enables the is_maximizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-maximizable", - "markdownDescription": "Enables the is_maximizable command without any pre-configured scope." - }, - { - "description": "Enables the is_maximized command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-maximized", - "markdownDescription": "Enables the is_maximized command without any pre-configured scope." - }, - { - "description": "Enables the is_minimizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-minimizable", - "markdownDescription": "Enables the is_minimizable command without any pre-configured scope." - }, - { - "description": "Enables the is_minimized command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-minimized", - "markdownDescription": "Enables the is_minimized command without any pre-configured scope." - }, - { - "description": "Enables the is_resizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-resizable", - "markdownDescription": "Enables the is_resizable command without any pre-configured scope." - }, - { - "description": "Enables the is_visible command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-visible", - "markdownDescription": "Enables the is_visible command without any pre-configured scope." - }, - { - "description": "Enables the maximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-maximize", - "markdownDescription": "Enables the maximize command without any pre-configured scope." - }, - { - "description": "Enables the minimize command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-minimize", - "markdownDescription": "Enables the minimize command without any pre-configured scope." - }, - { - "description": "Enables the monitor_from_point command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-monitor-from-point", - "markdownDescription": "Enables the monitor_from_point command without any pre-configured scope." - }, - { - "description": "Enables the outer_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-outer-position", - "markdownDescription": "Enables the outer_position command without any pre-configured scope." - }, - { - "description": "Enables the outer_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-outer-size", - "markdownDescription": "Enables the outer_size command without any pre-configured scope." - }, - { - "description": "Enables the primary_monitor command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-primary-monitor", - "markdownDescription": "Enables the primary_monitor command without any pre-configured scope." - }, - { - "description": "Enables the request_user_attention command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-request-user-attention", - "markdownDescription": "Enables the request_user_attention command without any pre-configured scope." - }, - { - "description": "Enables the scale_factor command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-scale-factor", - "markdownDescription": "Enables the scale_factor command without any pre-configured scope." - }, - { - "description": "Enables the set_always_on_bottom command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-always-on-bottom", - "markdownDescription": "Enables the set_always_on_bottom command without any pre-configured scope." - }, - { - "description": "Enables the set_always_on_top command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-always-on-top", - "markdownDescription": "Enables the set_always_on_top command without any pre-configured scope." - }, - { - "description": "Enables the set_background_color command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-background-color", - "markdownDescription": "Enables the set_background_color command without any pre-configured scope." - }, - { - "description": "Enables the set_badge_count command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-badge-count", - "markdownDescription": "Enables the set_badge_count command without any pre-configured scope." - }, - { - "description": "Enables the set_badge_label command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-badge-label", - "markdownDescription": "Enables the set_badge_label command without any pre-configured scope." - }, - { - "description": "Enables the set_closable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-closable", - "markdownDescription": "Enables the set_closable command without any pre-configured scope." - }, - { - "description": "Enables the set_content_protected command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-content-protected", - "markdownDescription": "Enables the set_content_protected command without any pre-configured scope." - }, - { - "description": "Enables the set_cursor_grab command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-cursor-grab", - "markdownDescription": "Enables the set_cursor_grab command without any pre-configured scope." - }, - { - "description": "Enables the set_cursor_icon command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-cursor-icon", - "markdownDescription": "Enables the set_cursor_icon command without any pre-configured scope." - }, - { - "description": "Enables the set_cursor_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-cursor-position", - "markdownDescription": "Enables the set_cursor_position command without any pre-configured scope." - }, - { - "description": "Enables the set_cursor_visible command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-cursor-visible", - "markdownDescription": "Enables the set_cursor_visible command without any pre-configured scope." - }, - { - "description": "Enables the set_decorations command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-decorations", - "markdownDescription": "Enables the set_decorations command without any pre-configured scope." - }, - { - "description": "Enables the set_effects command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-effects", - "markdownDescription": "Enables the set_effects command without any pre-configured scope." - }, - { - "description": "Enables the set_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-enabled", - "markdownDescription": "Enables the set_enabled command without any pre-configured scope." - }, - { - "description": "Enables the set_focus command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-focus", - "markdownDescription": "Enables the set_focus command without any pre-configured scope." - }, - { - "description": "Enables the set_fullscreen command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-fullscreen", - "markdownDescription": "Enables the set_fullscreen command without any pre-configured scope." - }, - { - "description": "Enables the set_icon command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-icon", - "markdownDescription": "Enables the set_icon command without any pre-configured scope." - }, - { - "description": "Enables the set_ignore_cursor_events command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-ignore-cursor-events", - "markdownDescription": "Enables the set_ignore_cursor_events command without any pre-configured scope." - }, - { - "description": "Enables the set_max_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-max-size", - "markdownDescription": "Enables the set_max_size command without any pre-configured scope." - }, - { - "description": "Enables the set_maximizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-maximizable", - "markdownDescription": "Enables the set_maximizable command without any pre-configured scope." - }, - { - "description": "Enables the set_min_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-min-size", - "markdownDescription": "Enables the set_min_size command without any pre-configured scope." - }, - { - "description": "Enables the set_minimizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-minimizable", - "markdownDescription": "Enables the set_minimizable command without any pre-configured scope." - }, - { - "description": "Enables the set_overlay_icon command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-overlay-icon", - "markdownDescription": "Enables the set_overlay_icon command without any pre-configured scope." - }, - { - "description": "Enables the set_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-position", - "markdownDescription": "Enables the set_position command without any pre-configured scope." - }, - { - "description": "Enables the set_progress_bar command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-progress-bar", - "markdownDescription": "Enables the set_progress_bar command without any pre-configured scope." - }, - { - "description": "Enables the set_resizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-resizable", - "markdownDescription": "Enables the set_resizable command without any pre-configured scope." - }, - { - "description": "Enables the set_shadow command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-shadow", - "markdownDescription": "Enables the set_shadow command without any pre-configured scope." - }, - { - "description": "Enables the set_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-size", - "markdownDescription": "Enables the set_size command without any pre-configured scope." - }, - { - "description": "Enables the set_size_constraints command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-size-constraints", - "markdownDescription": "Enables the set_size_constraints command without any pre-configured scope." - }, - { - "description": "Enables the set_skip_taskbar command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-skip-taskbar", - "markdownDescription": "Enables the set_skip_taskbar command without any pre-configured scope." - }, - { - "description": "Enables the set_theme command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-theme", - "markdownDescription": "Enables the set_theme command without any pre-configured scope." - }, - { - "description": "Enables the set_title command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-title", - "markdownDescription": "Enables the set_title command without any pre-configured scope." - }, - { - "description": "Enables the set_title_bar_style command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-title-bar-style", - "markdownDescription": "Enables the set_title_bar_style command without any pre-configured scope." - }, - { - "description": "Enables the set_visible_on_all_workspaces command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-visible-on-all-workspaces", - "markdownDescription": "Enables the set_visible_on_all_workspaces command without any pre-configured scope." - }, - { - "description": "Enables the show command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-show", - "markdownDescription": "Enables the show command without any pre-configured scope." - }, - { - "description": "Enables the start_dragging command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-start-dragging", - "markdownDescription": "Enables the start_dragging command without any pre-configured scope." - }, - { - "description": "Enables the start_resize_dragging command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-start-resize-dragging", - "markdownDescription": "Enables the start_resize_dragging command without any pre-configured scope." - }, - { - "description": "Enables the theme command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-theme", - "markdownDescription": "Enables the theme command without any pre-configured scope." - }, - { - "description": "Enables the title command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-title", - "markdownDescription": "Enables the title command without any pre-configured scope." - }, - { - "description": "Enables the toggle_maximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-toggle-maximize", - "markdownDescription": "Enables the toggle_maximize command without any pre-configured scope." - }, - { - "description": "Enables the unmaximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-unmaximize", - "markdownDescription": "Enables the unmaximize command without any pre-configured scope." - }, - { - "description": "Enables the unminimize command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-unminimize", - "markdownDescription": "Enables the unminimize command without any pre-configured scope." - }, - { - "description": "Denies the available_monitors command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-available-monitors", - "markdownDescription": "Denies the available_monitors command without any pre-configured scope." - }, - { - "description": "Denies the center command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-center", - "markdownDescription": "Denies the center command without any pre-configured scope." - }, - { - "description": "Denies the close command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-close", - "markdownDescription": "Denies the close command without any pre-configured scope." - }, - { - "description": "Denies the create command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-create", - "markdownDescription": "Denies the create command without any pre-configured scope." - }, - { - "description": "Denies the current_monitor command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-current-monitor", - "markdownDescription": "Denies the current_monitor command without any pre-configured scope." - }, - { - "description": "Denies the cursor_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-cursor-position", - "markdownDescription": "Denies the cursor_position command without any pre-configured scope." - }, - { - "description": "Denies the destroy command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-destroy", - "markdownDescription": "Denies the destroy command without any pre-configured scope." - }, - { - "description": "Denies the get_all_windows command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-get-all-windows", - "markdownDescription": "Denies the get_all_windows command without any pre-configured scope." - }, - { - "description": "Denies the hide command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-hide", - "markdownDescription": "Denies the hide command without any pre-configured scope." - }, - { - "description": "Denies the inner_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-inner-position", - "markdownDescription": "Denies the inner_position command without any pre-configured scope." - }, - { - "description": "Denies the inner_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-inner-size", - "markdownDescription": "Denies the inner_size command without any pre-configured scope." - }, - { - "description": "Denies the internal_toggle_maximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-internal-toggle-maximize", - "markdownDescription": "Denies the internal_toggle_maximize command without any pre-configured scope." - }, - { - "description": "Denies the is_always_on_top command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-always-on-top", - "markdownDescription": "Denies the is_always_on_top command without any pre-configured scope." - }, - { - "description": "Denies the is_closable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-closable", - "markdownDescription": "Denies the is_closable command without any pre-configured scope." - }, - { - "description": "Denies the is_decorated command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-decorated", - "markdownDescription": "Denies the is_decorated command without any pre-configured scope." - }, - { - "description": "Denies the is_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-enabled", - "markdownDescription": "Denies the is_enabled command without any pre-configured scope." - }, - { - "description": "Denies the is_focused command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-focused", - "markdownDescription": "Denies the is_focused command without any pre-configured scope." - }, - { - "description": "Denies the is_fullscreen command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-fullscreen", - "markdownDescription": "Denies the is_fullscreen command without any pre-configured scope." - }, - { - "description": "Denies the is_maximizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-maximizable", - "markdownDescription": "Denies the is_maximizable command without any pre-configured scope." - }, - { - "description": "Denies the is_maximized command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-maximized", - "markdownDescription": "Denies the is_maximized command without any pre-configured scope." - }, - { - "description": "Denies the is_minimizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-minimizable", - "markdownDescription": "Denies the is_minimizable command without any pre-configured scope." - }, - { - "description": "Denies the is_minimized command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-minimized", - "markdownDescription": "Denies the is_minimized command without any pre-configured scope." - }, - { - "description": "Denies the is_resizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-resizable", - "markdownDescription": "Denies the is_resizable command without any pre-configured scope." - }, - { - "description": "Denies the is_visible command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-visible", - "markdownDescription": "Denies the is_visible command without any pre-configured scope." - }, - { - "description": "Denies the maximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-maximize", - "markdownDescription": "Denies the maximize command without any pre-configured scope." - }, - { - "description": "Denies the minimize command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-minimize", - "markdownDescription": "Denies the minimize command without any pre-configured scope." - }, - { - "description": "Denies the monitor_from_point command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-monitor-from-point", - "markdownDescription": "Denies the monitor_from_point command without any pre-configured scope." - }, - { - "description": "Denies the outer_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-outer-position", - "markdownDescription": "Denies the outer_position command without any pre-configured scope." - }, - { - "description": "Denies the outer_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-outer-size", - "markdownDescription": "Denies the outer_size command without any pre-configured scope." - }, - { - "description": "Denies the primary_monitor command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-primary-monitor", - "markdownDescription": "Denies the primary_monitor command without any pre-configured scope." - }, - { - "description": "Denies the request_user_attention command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-request-user-attention", - "markdownDescription": "Denies the request_user_attention command without any pre-configured scope." - }, - { - "description": "Denies the scale_factor command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-scale-factor", - "markdownDescription": "Denies the scale_factor command without any pre-configured scope." - }, - { - "description": "Denies the set_always_on_bottom command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-always-on-bottom", - "markdownDescription": "Denies the set_always_on_bottom command without any pre-configured scope." - }, - { - "description": "Denies the set_always_on_top command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-always-on-top", - "markdownDescription": "Denies the set_always_on_top command without any pre-configured scope." - }, - { - "description": "Denies the set_background_color command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-background-color", - "markdownDescription": "Denies the set_background_color command without any pre-configured scope." - }, - { - "description": "Denies the set_badge_count command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-badge-count", - "markdownDescription": "Denies the set_badge_count command without any pre-configured scope." - }, - { - "description": "Denies the set_badge_label command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-badge-label", - "markdownDescription": "Denies the set_badge_label command without any pre-configured scope." - }, - { - "description": "Denies the set_closable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-closable", - "markdownDescription": "Denies the set_closable command without any pre-configured scope." - }, - { - "description": "Denies the set_content_protected command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-content-protected", - "markdownDescription": "Denies the set_content_protected command without any pre-configured scope." - }, - { - "description": "Denies the set_cursor_grab command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-cursor-grab", - "markdownDescription": "Denies the set_cursor_grab command without any pre-configured scope." - }, - { - "description": "Denies the set_cursor_icon command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-cursor-icon", - "markdownDescription": "Denies the set_cursor_icon command without any pre-configured scope." - }, - { - "description": "Denies the set_cursor_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-cursor-position", - "markdownDescription": "Denies the set_cursor_position command without any pre-configured scope." - }, - { - "description": "Denies the set_cursor_visible command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-cursor-visible", - "markdownDescription": "Denies the set_cursor_visible command without any pre-configured scope." - }, - { - "description": "Denies the set_decorations command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-decorations", - "markdownDescription": "Denies the set_decorations command without any pre-configured scope." - }, - { - "description": "Denies the set_effects command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-effects", - "markdownDescription": "Denies the set_effects command without any pre-configured scope." - }, - { - "description": "Denies the set_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-enabled", - "markdownDescription": "Denies the set_enabled command without any pre-configured scope." - }, - { - "description": "Denies the set_focus command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-focus", - "markdownDescription": "Denies the set_focus command without any pre-configured scope." - }, - { - "description": "Denies the set_fullscreen command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-fullscreen", - "markdownDescription": "Denies the set_fullscreen command without any pre-configured scope." - }, - { - "description": "Denies the set_icon command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-icon", - "markdownDescription": "Denies the set_icon command without any pre-configured scope." - }, - { - "description": "Denies the set_ignore_cursor_events command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-ignore-cursor-events", - "markdownDescription": "Denies the set_ignore_cursor_events command without any pre-configured scope." - }, - { - "description": "Denies the set_max_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-max-size", - "markdownDescription": "Denies the set_max_size command without any pre-configured scope." - }, - { - "description": "Denies the set_maximizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-maximizable", - "markdownDescription": "Denies the set_maximizable command without any pre-configured scope." - }, - { - "description": "Denies the set_min_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-min-size", - "markdownDescription": "Denies the set_min_size command without any pre-configured scope." - }, - { - "description": "Denies the set_minimizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-minimizable", - "markdownDescription": "Denies the set_minimizable command without any pre-configured scope." - }, - { - "description": "Denies the set_overlay_icon command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-overlay-icon", - "markdownDescription": "Denies the set_overlay_icon command without any pre-configured scope." - }, - { - "description": "Denies the set_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-position", - "markdownDescription": "Denies the set_position command without any pre-configured scope." - }, - { - "description": "Denies the set_progress_bar command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-progress-bar", - "markdownDescription": "Denies the set_progress_bar command without any pre-configured scope." - }, - { - "description": "Denies the set_resizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-resizable", - "markdownDescription": "Denies the set_resizable command without any pre-configured scope." - }, - { - "description": "Denies the set_shadow command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-shadow", - "markdownDescription": "Denies the set_shadow command without any pre-configured scope." - }, - { - "description": "Denies the set_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-size", - "markdownDescription": "Denies the set_size command without any pre-configured scope." - }, - { - "description": "Denies the set_size_constraints command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-size-constraints", - "markdownDescription": "Denies the set_size_constraints command without any pre-configured scope." - }, - { - "description": "Denies the set_skip_taskbar command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-skip-taskbar", - "markdownDescription": "Denies the set_skip_taskbar command without any pre-configured scope." - }, - { - "description": "Denies the set_theme command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-theme", - "markdownDescription": "Denies the set_theme command without any pre-configured scope." - }, - { - "description": "Denies the set_title command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-title", - "markdownDescription": "Denies the set_title command without any pre-configured scope." - }, - { - "description": "Denies the set_title_bar_style command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-title-bar-style", - "markdownDescription": "Denies the set_title_bar_style command without any pre-configured scope." - }, - { - "description": "Denies the set_visible_on_all_workspaces command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-visible-on-all-workspaces", - "markdownDescription": "Denies the set_visible_on_all_workspaces command without any pre-configured scope." - }, - { - "description": "Denies the show command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-show", - "markdownDescription": "Denies the show command without any pre-configured scope." - }, - { - "description": "Denies the start_dragging command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-start-dragging", - "markdownDescription": "Denies the start_dragging command without any pre-configured scope." - }, - { - "description": "Denies the start_resize_dragging command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-start-resize-dragging", - "markdownDescription": "Denies the start_resize_dragging command without any pre-configured scope." - }, - { - "description": "Denies the theme command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-theme", - "markdownDescription": "Denies the theme command without any pre-configured scope." - }, - { - "description": "Denies the title command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-title", - "markdownDescription": "Denies the title command without any pre-configured scope." - }, - { - "description": "Denies the toggle_maximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-toggle-maximize", - "markdownDescription": "Denies the toggle_maximize command without any pre-configured scope." - }, - { - "description": "Denies the unmaximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-unmaximize", - "markdownDescription": "Denies the unmaximize command without any pre-configured scope." - }, - { - "description": "Denies the unminimize command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-unminimize", - "markdownDescription": "Denies the unminimize command without any pre-configured scope." - }, - { - "description": "This permission set configures what kind of\nfetch operations are available from the http plugin.\n\nThis enables all fetch operations but does not\nallow explicitly any origins to be fetched. This needs to\nbe manually configured before usage.\n\n#### Granted Permissions\n\nAll fetch operations are enabled.\n\n\n#### This default permission set includes:\n\n- `allow-fetch`\n- `allow-fetch-cancel`\n- `allow-fetch-read-body`\n- `allow-fetch-send`", - "type": "string", - "const": "http:default", - "markdownDescription": "This permission set configures what kind of\nfetch operations are available from the http plugin.\n\nThis enables all fetch operations but does not\nallow explicitly any origins to be fetched. This needs to\nbe manually configured before usage.\n\n#### Granted Permissions\n\nAll fetch operations are enabled.\n\n\n#### This default permission set includes:\n\n- `allow-fetch`\n- `allow-fetch-cancel`\n- `allow-fetch-read-body`\n- `allow-fetch-send`" - }, - { - "description": "Enables the fetch command without any pre-configured scope.", - "type": "string", - "const": "http:allow-fetch", - "markdownDescription": "Enables the fetch command without any pre-configured scope." - }, - { - "description": "Enables the fetch_cancel command without any pre-configured scope.", - "type": "string", - "const": "http:allow-fetch-cancel", - "markdownDescription": "Enables the fetch_cancel command without any pre-configured scope." - }, - { - "description": "Enables the fetch_read_body command without any pre-configured scope.", - "type": "string", - "const": "http:allow-fetch-read-body", - "markdownDescription": "Enables the fetch_read_body command without any pre-configured scope." - }, - { - "description": "Enables the fetch_send command without any pre-configured scope.", - "type": "string", - "const": "http:allow-fetch-send", - "markdownDescription": "Enables the fetch_send command without any pre-configured scope." - }, - { - "description": "Denies the fetch command without any pre-configured scope.", - "type": "string", - "const": "http:deny-fetch", - "markdownDescription": "Denies the fetch command without any pre-configured scope." - }, - { - "description": "Denies the fetch_cancel command without any pre-configured scope.", - "type": "string", - "const": "http:deny-fetch-cancel", - "markdownDescription": "Denies the fetch_cancel command without any pre-configured scope." - }, - { - "description": "Denies the fetch_read_body command without any pre-configured scope.", - "type": "string", - "const": "http:deny-fetch-read-body", - "markdownDescription": "Denies the fetch_read_body command without any pre-configured scope." - }, - { - "description": "Denies the fetch_send command without any pre-configured scope.", - "type": "string", - "const": "http:deny-fetch-send", - "markdownDescription": "Denies the fetch_send command without any pre-configured scope." - }, - { - "description": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`", - "type": "string", - "const": "shell:default", - "markdownDescription": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`" - }, - { - "description": "Enables the execute command without any pre-configured scope.", - "type": "string", - "const": "shell:allow-execute", - "markdownDescription": "Enables the execute command without any pre-configured scope." - }, - { - "description": "Enables the kill command without any pre-configured scope.", - "type": "string", - "const": "shell:allow-kill", - "markdownDescription": "Enables the kill command without any pre-configured scope." - }, - { - "description": "Enables the open command without any pre-configured scope.", - "type": "string", - "const": "shell:allow-open", - "markdownDescription": "Enables the open command without any pre-configured scope." - }, - { - "description": "Enables the spawn command without any pre-configured scope.", - "type": "string", - "const": "shell:allow-spawn", - "markdownDescription": "Enables the spawn command without any pre-configured scope." - }, - { - "description": "Enables the stdin_write command without any pre-configured scope.", - "type": "string", - "const": "shell:allow-stdin-write", - "markdownDescription": "Enables the stdin_write command without any pre-configured scope." - }, - { - "description": "Denies the execute command without any pre-configured scope.", - "type": "string", - "const": "shell:deny-execute", - "markdownDescription": "Denies the execute command without any pre-configured scope." - }, - { - "description": "Denies the kill command without any pre-configured scope.", - "type": "string", - "const": "shell:deny-kill", - "markdownDescription": "Denies the kill command without any pre-configured scope." - }, - { - "description": "Denies the open command without any pre-configured scope.", - "type": "string", - "const": "shell:deny-open", - "markdownDescription": "Denies the open command without any pre-configured scope." - }, - { - "description": "Denies the spawn command without any pre-configured scope.", - "type": "string", - "const": "shell:deny-spawn", - "markdownDescription": "Denies the spawn command without any pre-configured scope." - }, - { - "description": "Denies the stdin_write command without any pre-configured scope.", - "type": "string", - "const": "shell:deny-stdin-write", - "markdownDescription": "Denies the stdin_write command without any pre-configured scope." - } - ] - }, - "Value": { - "description": "All supported ACL values.", - "anyOf": [ - { - "description": "Represents a null JSON value.", - "type": "null" - }, - { - "description": "Represents a [`bool`].", - "type": "boolean" - }, - { - "description": "Represents a valid ACL [`Number`].", - "allOf": [ - { - "$ref": "#/definitions/Number" - } - ] - }, - { - "description": "Represents a [`String`].", - "type": "string" - }, - { - "description": "Represents a list of other [`Value`]s.", - "type": "array", - "items": { - "$ref": "#/definitions/Value" - } - }, - { - "description": "Represents a map of [`String`] keys to [`Value`]s.", - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/Value" - } - } - ] - }, - "Number": { - "description": "A valid ACL number.", - "anyOf": [ - { - "description": "Represents an [`i64`].", - "type": "integer", - "format": "int64" - }, - { - "description": "Represents a [`f64`].", - "type": "number", - "format": "double" - } - ] - }, - "Target": { - "description": "Platform target.", - "oneOf": [ - { - "description": "MacOS.", - "type": "string", - "enum": [ - "macOS" - ] - }, - { - "description": "Windows.", - "type": "string", - "enum": [ - "windows" - ] - }, - { - "description": "Linux.", - "type": "string", - "enum": [ - "linux" - ] - }, - { - "description": "Android.", - "type": "string", - "enum": [ - "android" - ] - }, - { - "description": "iOS.", - "type": "string", - "enum": [ - "iOS" - ] - } - ] - }, - "ShellScopeEntryAllowedArg": { - "description": "A command argument allowed to be executed by the webview API.", - "anyOf": [ - { - "description": "A non-configurable argument that is passed to the command in the order it was specified.", - "type": "string" - }, - { - "description": "A variable that is set while calling the command from the webview API.", - "type": "object", - "required": [ - "validator" - ], - "properties": { - "raw": { - "description": "Marks the validator as a raw regex, meaning the plugin should not make any modification at runtime.\n\nThis means the regex will not match on the entire string by default, which might be exploited if your regex allow unexpected input to be considered valid. When using this option, make sure your regex is correct.", - "default": false, - "type": "boolean" - }, - "validator": { - "description": "[regex] validator to require passed values to conform to an expected input.\n\nThis will require the argument value passed to this variable to match the `validator` regex before it will be executed.\n\nThe regex string is by default surrounded by `^...$` to match the full string. For example the `https?://\\w+` regex would be registered as `^https?://\\w+$`.\n\n[regex]: ", - "type": "string" - } - }, - "additionalProperties": false - } - ] - }, - "ShellScopeEntryAllowedArgs": { - "description": "A set of command arguments allowed to be executed by the webview API.\n\nA value of `true` will allow any arguments to be passed to the command. `false` will disable all arguments. A list of [`ShellScopeEntryAllowedArg`] will set those arguments as the only valid arguments to be passed to the attached command configuration.", - "anyOf": [ - { - "description": "Use a simple boolean to allow all or disable all arguments to this command configuration.", - "type": "boolean" - }, - { - "description": "A specific set of [`ShellScopeEntryAllowedArg`] that are valid to call for the command configuration.", - "type": "array", - "items": { - "$ref": "#/definitions/ShellScopeEntryAllowedArg" - } - } - ] - } - } -} \ No newline at end of file diff --git a/frontend/src-tauri/gen/schemas/linux-schema.json b/frontend/src-tauri/gen/schemas/linux-schema.json deleted file mode 100644 index f7e4fbace6..0000000000 --- a/frontend/src-tauri/gen/schemas/linux-schema.json +++ /dev/null @@ -1,2614 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "CapabilityFile", - "description": "Capability formats accepted in a capability file.", - "anyOf": [ - { - "description": "A single capability.", - "allOf": [ - { - "$ref": "#/definitions/Capability" - } - ] - }, - { - "description": "A list of capabilities.", - "type": "array", - "items": { - "$ref": "#/definitions/Capability" - } - }, - { - "description": "A list of capabilities.", - "type": "object", - "required": ["capabilities"], - "properties": { - "capabilities": { - "description": "The list of capabilities.", - "type": "array", - "items": { - "$ref": "#/definitions/Capability" - } - } - } - } - ], - "definitions": { - "Capability": { - "description": "A grouping and boundary mechanism developers can use to isolate access to the IPC layer.\n\nIt controls application windows' and webviews' fine grained access to the Tauri core, application, or plugin commands. If a webview or its window is not matching any capability then it has no access to the IPC layer at all.\n\nThis can be done to create groups of windows, based on their required system access, which can reduce impact of frontend vulnerabilities in less privileged windows. Windows can be added to a capability by exact name (e.g. `main-window`) or glob patterns like `*` or `admin-*`. A Window can have none, one, or multiple associated capabilities.\n\n## Example\n\n```json { \"identifier\": \"main-user-files-write\", \"description\": \"This capability allows the `main` window on macOS and Windows access to `filesystem` write related commands and `dialog` commands to enable programatic access to files selected by the user.\", \"windows\": [ \"main\" ], \"permissions\": [ \"core:default\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] }, ], \"platforms\": [\"macOS\",\"windows\"] } ```", - "type": "object", - "required": ["identifier", "permissions"], - "properties": { - "identifier": { - "description": "Identifier of the capability.\n\n## Example\n\n`main-user-files-write`", - "type": "string" - }, - "description": { - "description": "Description of what the capability is intended to allow on associated windows.\n\nIt should contain a description of what the grouped permissions should allow.\n\n## Example\n\nThis capability allows the `main` window access to `filesystem` write related commands and `dialog` commands to enable programatic access to files selected by the user.", - "default": "", - "type": "string" - }, - "remote": { - "description": "Configure remote URLs that can use the capability permissions.\n\nThis setting is optional and defaults to not being set, as our default use case is that the content is served from our local application.\n\n:::caution Make sure you understand the security implications of providing remote sources with local system access. :::\n\n## Example\n\n```json { \"urls\": [\"https://*.mydomain.dev\"] } ```", - "anyOf": [ - { - "$ref": "#/definitions/CapabilityRemote" - }, - { - "type": "null" - } - ] - }, - "local": { - "description": "Whether this capability is enabled for local app URLs or not. Defaults to `true`.", - "default": true, - "type": "boolean" - }, - "windows": { - "description": "List of windows that are affected by this capability. Can be a glob pattern.\n\nIf a window label matches any of the patterns in this list, the capability will be enabled on all the webviews of that window, regardless of the value of [`Self::webviews`].\n\nOn multiwebview windows, prefer specifying [`Self::webviews`] and omitting [`Self::windows`] for a fine grained access control.\n\n## Example\n\n`[\"main\"]`", - "type": "array", - "items": { - "type": "string" - } - }, - "webviews": { - "description": "List of webviews that are affected by this capability. Can be a glob pattern.\n\nThe capability will be enabled on all the webviews whose label matches any of the patterns in this list, regardless of whether the webview's window label matches a pattern in [`Self::windows`].\n\n## Example\n\n`[\"sub-webview-one\", \"sub-webview-two\"]`", - "type": "array", - "items": { - "type": "string" - } - }, - "permissions": { - "description": "List of permissions attached to this capability.\n\nMust include the plugin name as prefix in the form of `${plugin-name}:${permission-name}`. For commands directly implemented in the application itself only `${permission-name}` is required.\n\n## Example\n\n```json [ \"core:default\", \"shell:allow-open\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] } ] ```", - "type": "array", - "items": { - "$ref": "#/definitions/PermissionEntry" - }, - "uniqueItems": true - }, - "platforms": { - "description": "Limit which target platforms this capability applies to.\n\nBy default all platforms are targeted.\n\n## Example\n\n`[\"macOS\",\"windows\"]`", - "type": ["array", "null"], - "items": { - "$ref": "#/definitions/Target" - } - } - } - }, - "CapabilityRemote": { - "description": "Configuration for remote URLs that are associated with the capability.", - "type": "object", - "required": ["urls"], - "properties": { - "urls": { - "description": "Remote domains this capability refers to using the [URLPattern standard](https://urlpattern.spec.whatwg.org/).\n\n## Examples\n\n- \"https://*.mydomain.dev\": allows subdomains of mydomain.dev - \"https://mydomain.dev/api/*\": allows any subpath of mydomain.dev/api", - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "PermissionEntry": { - "description": "An entry for a permission value in a [`Capability`] can be either a raw permission [`Identifier`] or an object that references a permission and extends its scope.", - "anyOf": [ - { - "description": "Reference a permission or permission set by identifier.", - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ] - }, - { - "description": "Reference a permission or permission set by identifier and extends its scope.", - "type": "object", - "allOf": [ - { - "if": { - "properties": { - "identifier": { - "anyOf": [ - { - "description": "This permission set configures what kind of\nfetch operations are available from the http plugin.\n\nThis enables all fetch operations but does not\nallow explicitly any origins to be fetched. This needs to\nbe manually configured before usage.\n\n#### Granted Permissions\n\nAll fetch operations are enabled.\n\n\n#### This default permission set includes:\n\n- `allow-fetch`\n- `allow-fetch-cancel`\n- `allow-fetch-read-body`\n- `allow-fetch-send`", - "type": "string", - "const": "http:default", - "markdownDescription": "This permission set configures what kind of\nfetch operations are available from the http plugin.\n\nThis enables all fetch operations but does not\nallow explicitly any origins to be fetched. This needs to\nbe manually configured before usage.\n\n#### Granted Permissions\n\nAll fetch operations are enabled.\n\n\n#### This default permission set includes:\n\n- `allow-fetch`\n- `allow-fetch-cancel`\n- `allow-fetch-read-body`\n- `allow-fetch-send`" - }, - { - "description": "Enables the fetch command without any pre-configured scope.", - "type": "string", - "const": "http:allow-fetch", - "markdownDescription": "Enables the fetch command without any pre-configured scope." - }, - { - "description": "Enables the fetch_cancel command without any pre-configured scope.", - "type": "string", - "const": "http:allow-fetch-cancel", - "markdownDescription": "Enables the fetch_cancel command without any pre-configured scope." - }, - { - "description": "Enables the fetch_read_body command without any pre-configured scope.", - "type": "string", - "const": "http:allow-fetch-read-body", - "markdownDescription": "Enables the fetch_read_body command without any pre-configured scope." - }, - { - "description": "Enables the fetch_send command without any pre-configured scope.", - "type": "string", - "const": "http:allow-fetch-send", - "markdownDescription": "Enables the fetch_send command without any pre-configured scope." - }, - { - "description": "Denies the fetch command without any pre-configured scope.", - "type": "string", - "const": "http:deny-fetch", - "markdownDescription": "Denies the fetch command without any pre-configured scope." - }, - { - "description": "Denies the fetch_cancel command without any pre-configured scope.", - "type": "string", - "const": "http:deny-fetch-cancel", - "markdownDescription": "Denies the fetch_cancel command without any pre-configured scope." - }, - { - "description": "Denies the fetch_read_body command without any pre-configured scope.", - "type": "string", - "const": "http:deny-fetch-read-body", - "markdownDescription": "Denies the fetch_read_body command without any pre-configured scope." - }, - { - "description": "Denies the fetch_send command without any pre-configured scope.", - "type": "string", - "const": "http:deny-fetch-send", - "markdownDescription": "Denies the fetch_send command without any pre-configured scope." - } - ] - } - } - }, - "then": { - "properties": { - "allow": { - "items": { - "title": "HttpScopeEntry", - "description": "HTTP scope entry.", - "anyOf": [ - { - "description": "A URL that can be accessed by the webview when using the HTTP APIs. Wildcards can be used following the URL pattern standard.\n\nSee [the URL Pattern spec](https://urlpattern.spec.whatwg.org/) for more information.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin on port 443\n\n- \"https://*:*\" : allows all HTTPS origin on any port\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"", - "type": "string" - }, - { - "type": "object", - "required": ["url"], - "properties": { - "url": { - "description": "A URL that can be accessed by the webview when using the HTTP APIs. Wildcards can be used following the URL pattern standard.\n\nSee [the URL Pattern spec](https://urlpattern.spec.whatwg.org/) for more information.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin on port 443\n\n- \"https://*:*\" : allows all HTTPS origin on any port\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"", - "type": "string" - } - } - } - ] - } - }, - "deny": { - "items": { - "title": "HttpScopeEntry", - "description": "HTTP scope entry.", - "anyOf": [ - { - "description": "A URL that can be accessed by the webview when using the HTTP APIs. Wildcards can be used following the URL pattern standard.\n\nSee [the URL Pattern spec](https://urlpattern.spec.whatwg.org/) for more information.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin on port 443\n\n- \"https://*:*\" : allows all HTTPS origin on any port\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"", - "type": "string" - }, - { - "type": "object", - "required": ["url"], - "properties": { - "url": { - "description": "A URL that can be accessed by the webview when using the HTTP APIs. Wildcards can be used following the URL pattern standard.\n\nSee [the URL Pattern spec](https://urlpattern.spec.whatwg.org/) for more information.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin on port 443\n\n- \"https://*:*\" : allows all HTTPS origin on any port\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"", - "type": "string" - } - } - } - ] - } - } - } - }, - "properties": { - "identifier": { - "description": "Identifier of the permission or permission set.", - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ] - } - } - }, - { - "if": { - "properties": { - "identifier": { - "anyOf": [ - { - "description": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`", - "type": "string", - "const": "shell:default", - "markdownDescription": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`" - }, - { - "description": "Enables the execute command without any pre-configured scope.", - "type": "string", - "const": "shell:allow-execute", - "markdownDescription": "Enables the execute command without any pre-configured scope." - }, - { - "description": "Enables the kill command without any pre-configured scope.", - "type": "string", - "const": "shell:allow-kill", - "markdownDescription": "Enables the kill command without any pre-configured scope." - }, - { - "description": "Enables the open command without any pre-configured scope.", - "type": "string", - "const": "shell:allow-open", - "markdownDescription": "Enables the open command without any pre-configured scope." - }, - { - "description": "Enables the spawn command without any pre-configured scope.", - "type": "string", - "const": "shell:allow-spawn", - "markdownDescription": "Enables the spawn command without any pre-configured scope." - }, - { - "description": "Enables the stdin_write command without any pre-configured scope.", - "type": "string", - "const": "shell:allow-stdin-write", - "markdownDescription": "Enables the stdin_write command without any pre-configured scope." - }, - { - "description": "Denies the execute command without any pre-configured scope.", - "type": "string", - "const": "shell:deny-execute", - "markdownDescription": "Denies the execute command without any pre-configured scope." - }, - { - "description": "Denies the kill command without any pre-configured scope.", - "type": "string", - "const": "shell:deny-kill", - "markdownDescription": "Denies the kill command without any pre-configured scope." - }, - { - "description": "Denies the open command without any pre-configured scope.", - "type": "string", - "const": "shell:deny-open", - "markdownDescription": "Denies the open command without any pre-configured scope." - }, - { - "description": "Denies the spawn command without any pre-configured scope.", - "type": "string", - "const": "shell:deny-spawn", - "markdownDescription": "Denies the spawn command without any pre-configured scope." - }, - { - "description": "Denies the stdin_write command without any pre-configured scope.", - "type": "string", - "const": "shell:deny-stdin-write", - "markdownDescription": "Denies the stdin_write command without any pre-configured scope." - } - ] - } - } - }, - "then": { - "properties": { - "allow": { - "items": { - "title": "ShellScopeEntry", - "description": "Shell scope entry.", - "anyOf": [ - { - "type": "object", - "required": ["cmd", "name"], - "properties": { - "args": { - "description": "The allowed arguments for the command execution.", - "allOf": [ - { - "$ref": "#/definitions/ShellScopeEntryAllowedArgs" - } - ] - }, - "cmd": { - "description": "The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", - "type": "string" - }, - "name": { - "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", - "type": "string" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": ["name", "sidecar"], - "properties": { - "args": { - "description": "The allowed arguments for the command execution.", - "allOf": [ - { - "$ref": "#/definitions/ShellScopeEntryAllowedArgs" - } - ] - }, - "name": { - "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", - "type": "string" - }, - "sidecar": { - "description": "If this command is a sidecar command.", - "type": "boolean" - } - }, - "additionalProperties": false - } - ] - } - }, - "deny": { - "items": { - "title": "ShellScopeEntry", - "description": "Shell scope entry.", - "anyOf": [ - { - "type": "object", - "required": ["cmd", "name"], - "properties": { - "args": { - "description": "The allowed arguments for the command execution.", - "allOf": [ - { - "$ref": "#/definitions/ShellScopeEntryAllowedArgs" - } - ] - }, - "cmd": { - "description": "The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", - "type": "string" - }, - "name": { - "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", - "type": "string" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": ["name", "sidecar"], - "properties": { - "args": { - "description": "The allowed arguments for the command execution.", - "allOf": [ - { - "$ref": "#/definitions/ShellScopeEntryAllowedArgs" - } - ] - }, - "name": { - "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", - "type": "string" - }, - "sidecar": { - "description": "If this command is a sidecar command.", - "type": "boolean" - } - }, - "additionalProperties": false - } - ] - } - } - } - }, - "properties": { - "identifier": { - "description": "Identifier of the permission or permission set.", - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ] - } - } - }, - { - "properties": { - "identifier": { - "description": "Identifier of the permission or permission set.", - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ] - }, - "allow": { - "description": "Data that defines what is allowed by the scope.", - "type": ["array", "null"], - "items": { - "$ref": "#/definitions/Value" - } - }, - "deny": { - "description": "Data that defines what is denied by the scope. This should be prioritized by validation logic.", - "type": ["array", "null"], - "items": { - "$ref": "#/definitions/Value" - } - } - } - } - ], - "required": ["identifier"] - } - ] - }, - "Identifier": { - "description": "Permission identifier", - "oneOf": [ - { - "description": "Default core plugins set.\n#### This default permission set includes:\n\n- `core:path:default`\n- `core:event:default`\n- `core:window:default`\n- `core:webview:default`\n- `core:app:default`\n- `core:image:default`\n- `core:resources:default`\n- `core:menu:default`\n- `core:tray:default`", - "type": "string", - "const": "core:default", - "markdownDescription": "Default core plugins set.\n#### This default permission set includes:\n\n- `core:path:default`\n- `core:event:default`\n- `core:window:default`\n- `core:webview:default`\n- `core:app:default`\n- `core:image:default`\n- `core:resources:default`\n- `core:menu:default`\n- `core:tray:default`" - }, - { - "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-version`\n- `allow-name`\n- `allow-tauri-version`\n- `allow-identifier`", - "type": "string", - "const": "core:app:default", - "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-version`\n- `allow-name`\n- `allow-tauri-version`\n- `allow-identifier`" - }, - { - "description": "Enables the app_hide command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-app-hide", - "markdownDescription": "Enables the app_hide command without any pre-configured scope." - }, - { - "description": "Enables the app_show command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-app-show", - "markdownDescription": "Enables the app_show command without any pre-configured scope." - }, - { - "description": "Enables the default_window_icon command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-default-window-icon", - "markdownDescription": "Enables the default_window_icon command without any pre-configured scope." - }, - { - "description": "Enables the fetch_data_store_identifiers command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-fetch-data-store-identifiers", - "markdownDescription": "Enables the fetch_data_store_identifiers command without any pre-configured scope." - }, - { - "description": "Enables the identifier command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-identifier", - "markdownDescription": "Enables the identifier command without any pre-configured scope." - }, - { - "description": "Enables the name command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-name", - "markdownDescription": "Enables the name command without any pre-configured scope." - }, - { - "description": "Enables the remove_data_store command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-remove-data-store", - "markdownDescription": "Enables the remove_data_store command without any pre-configured scope." - }, - { - "description": "Enables the set_app_theme command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-set-app-theme", - "markdownDescription": "Enables the set_app_theme command without any pre-configured scope." - }, - { - "description": "Enables the tauri_version command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-tauri-version", - "markdownDescription": "Enables the tauri_version command without any pre-configured scope." - }, - { - "description": "Enables the version command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-version", - "markdownDescription": "Enables the version command without any pre-configured scope." - }, - { - "description": "Denies the app_hide command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-app-hide", - "markdownDescription": "Denies the app_hide command without any pre-configured scope." - }, - { - "description": "Denies the app_show command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-app-show", - "markdownDescription": "Denies the app_show command without any pre-configured scope." - }, - { - "description": "Denies the default_window_icon command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-default-window-icon", - "markdownDescription": "Denies the default_window_icon command without any pre-configured scope." - }, - { - "description": "Denies the fetch_data_store_identifiers command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-fetch-data-store-identifiers", - "markdownDescription": "Denies the fetch_data_store_identifiers command without any pre-configured scope." - }, - { - "description": "Denies the identifier command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-identifier", - "markdownDescription": "Denies the identifier command without any pre-configured scope." - }, - { - "description": "Denies the name command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-name", - "markdownDescription": "Denies the name command without any pre-configured scope." - }, - { - "description": "Denies the remove_data_store command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-remove-data-store", - "markdownDescription": "Denies the remove_data_store command without any pre-configured scope." - }, - { - "description": "Denies the set_app_theme command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-set-app-theme", - "markdownDescription": "Denies the set_app_theme command without any pre-configured scope." - }, - { - "description": "Denies the tauri_version command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-tauri-version", - "markdownDescription": "Denies the tauri_version command without any pre-configured scope." - }, - { - "description": "Denies the version command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-version", - "markdownDescription": "Denies the version command without any pre-configured scope." - }, - { - "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-listen`\n- `allow-unlisten`\n- `allow-emit`\n- `allow-emit-to`", - "type": "string", - "const": "core:event:default", - "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-listen`\n- `allow-unlisten`\n- `allow-emit`\n- `allow-emit-to`" - }, - { - "description": "Enables the emit command without any pre-configured scope.", - "type": "string", - "const": "core:event:allow-emit", - "markdownDescription": "Enables the emit command without any pre-configured scope." - }, - { - "description": "Enables the emit_to command without any pre-configured scope.", - "type": "string", - "const": "core:event:allow-emit-to", - "markdownDescription": "Enables the emit_to command without any pre-configured scope." - }, - { - "description": "Enables the listen command without any pre-configured scope.", - "type": "string", - "const": "core:event:allow-listen", - "markdownDescription": "Enables the listen command without any pre-configured scope." - }, - { - "description": "Enables the unlisten command without any pre-configured scope.", - "type": "string", - "const": "core:event:allow-unlisten", - "markdownDescription": "Enables the unlisten command without any pre-configured scope." - }, - { - "description": "Denies the emit command without any pre-configured scope.", - "type": "string", - "const": "core:event:deny-emit", - "markdownDescription": "Denies the emit command without any pre-configured scope." - }, - { - "description": "Denies the emit_to command without any pre-configured scope.", - "type": "string", - "const": "core:event:deny-emit-to", - "markdownDescription": "Denies the emit_to command without any pre-configured scope." - }, - { - "description": "Denies the listen command without any pre-configured scope.", - "type": "string", - "const": "core:event:deny-listen", - "markdownDescription": "Denies the listen command without any pre-configured scope." - }, - { - "description": "Denies the unlisten command without any pre-configured scope.", - "type": "string", - "const": "core:event:deny-unlisten", - "markdownDescription": "Denies the unlisten command without any pre-configured scope." - }, - { - "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-from-bytes`\n- `allow-from-path`\n- `allow-rgba`\n- `allow-size`", - "type": "string", - "const": "core:image:default", - "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-from-bytes`\n- `allow-from-path`\n- `allow-rgba`\n- `allow-size`" - }, - { - "description": "Enables the from_bytes command without any pre-configured scope.", - "type": "string", - "const": "core:image:allow-from-bytes", - "markdownDescription": "Enables the from_bytes command without any pre-configured scope." - }, - { - "description": "Enables the from_path command without any pre-configured scope.", - "type": "string", - "const": "core:image:allow-from-path", - "markdownDescription": "Enables the from_path command without any pre-configured scope." - }, - { - "description": "Enables the new command without any pre-configured scope.", - "type": "string", - "const": "core:image:allow-new", - "markdownDescription": "Enables the new command without any pre-configured scope." - }, - { - "description": "Enables the rgba command without any pre-configured scope.", - "type": "string", - "const": "core:image:allow-rgba", - "markdownDescription": "Enables the rgba command without any pre-configured scope." - }, - { - "description": "Enables the size command without any pre-configured scope.", - "type": "string", - "const": "core:image:allow-size", - "markdownDescription": "Enables the size command without any pre-configured scope." - }, - { - "description": "Denies the from_bytes command without any pre-configured scope.", - "type": "string", - "const": "core:image:deny-from-bytes", - "markdownDescription": "Denies the from_bytes command without any pre-configured scope." - }, - { - "description": "Denies the from_path command without any pre-configured scope.", - "type": "string", - "const": "core:image:deny-from-path", - "markdownDescription": "Denies the from_path command without any pre-configured scope." - }, - { - "description": "Denies the new command without any pre-configured scope.", - "type": "string", - "const": "core:image:deny-new", - "markdownDescription": "Denies the new command without any pre-configured scope." - }, - { - "description": "Denies the rgba command without any pre-configured scope.", - "type": "string", - "const": "core:image:deny-rgba", - "markdownDescription": "Denies the rgba command without any pre-configured scope." - }, - { - "description": "Denies the size command without any pre-configured scope.", - "type": "string", - "const": "core:image:deny-size", - "markdownDescription": "Denies the size command without any pre-configured scope." - }, - { - "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-append`\n- `allow-prepend`\n- `allow-insert`\n- `allow-remove`\n- `allow-remove-at`\n- `allow-items`\n- `allow-get`\n- `allow-popup`\n- `allow-create-default`\n- `allow-set-as-app-menu`\n- `allow-set-as-window-menu`\n- `allow-text`\n- `allow-set-text`\n- `allow-is-enabled`\n- `allow-set-enabled`\n- `allow-set-accelerator`\n- `allow-set-as-windows-menu-for-nsapp`\n- `allow-set-as-help-menu-for-nsapp`\n- `allow-is-checked`\n- `allow-set-checked`\n- `allow-set-icon`", - "type": "string", - "const": "core:menu:default", - "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-append`\n- `allow-prepend`\n- `allow-insert`\n- `allow-remove`\n- `allow-remove-at`\n- `allow-items`\n- `allow-get`\n- `allow-popup`\n- `allow-create-default`\n- `allow-set-as-app-menu`\n- `allow-set-as-window-menu`\n- `allow-text`\n- `allow-set-text`\n- `allow-is-enabled`\n- `allow-set-enabled`\n- `allow-set-accelerator`\n- `allow-set-as-windows-menu-for-nsapp`\n- `allow-set-as-help-menu-for-nsapp`\n- `allow-is-checked`\n- `allow-set-checked`\n- `allow-set-icon`" - }, - { - "description": "Enables the append command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-append", - "markdownDescription": "Enables the append command without any pre-configured scope." - }, - { - "description": "Enables the create_default command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-create-default", - "markdownDescription": "Enables the create_default command without any pre-configured scope." - }, - { - "description": "Enables the get command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-get", - "markdownDescription": "Enables the get command without any pre-configured scope." - }, - { - "description": "Enables the insert command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-insert", - "markdownDescription": "Enables the insert command without any pre-configured scope." - }, - { - "description": "Enables the is_checked command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-is-checked", - "markdownDescription": "Enables the is_checked command without any pre-configured scope." - }, - { - "description": "Enables the is_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-is-enabled", - "markdownDescription": "Enables the is_enabled command without any pre-configured scope." - }, - { - "description": "Enables the items command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-items", - "markdownDescription": "Enables the items command without any pre-configured scope." - }, - { - "description": "Enables the new command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-new", - "markdownDescription": "Enables the new command without any pre-configured scope." - }, - { - "description": "Enables the popup command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-popup", - "markdownDescription": "Enables the popup command without any pre-configured scope." - }, - { - "description": "Enables the prepend command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-prepend", - "markdownDescription": "Enables the prepend command without any pre-configured scope." - }, - { - "description": "Enables the remove command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-remove", - "markdownDescription": "Enables the remove command without any pre-configured scope." - }, - { - "description": "Enables the remove_at command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-remove-at", - "markdownDescription": "Enables the remove_at command without any pre-configured scope." - }, - { - "description": "Enables the set_accelerator command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-accelerator", - "markdownDescription": "Enables the set_accelerator command without any pre-configured scope." - }, - { - "description": "Enables the set_as_app_menu command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-as-app-menu", - "markdownDescription": "Enables the set_as_app_menu command without any pre-configured scope." - }, - { - "description": "Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-as-help-menu-for-nsapp", - "markdownDescription": "Enables the set_as_help_menu_for_nsapp command without any pre-configured scope." - }, - { - "description": "Enables the set_as_window_menu command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-as-window-menu", - "markdownDescription": "Enables the set_as_window_menu command without any pre-configured scope." - }, - { - "description": "Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-as-windows-menu-for-nsapp", - "markdownDescription": "Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope." - }, - { - "description": "Enables the set_checked command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-checked", - "markdownDescription": "Enables the set_checked command without any pre-configured scope." - }, - { - "description": "Enables the set_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-enabled", - "markdownDescription": "Enables the set_enabled command without any pre-configured scope." - }, - { - "description": "Enables the set_icon command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-icon", - "markdownDescription": "Enables the set_icon command without any pre-configured scope." - }, - { - "description": "Enables the set_text command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-text", - "markdownDescription": "Enables the set_text command without any pre-configured scope." - }, - { - "description": "Enables the text command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-text", - "markdownDescription": "Enables the text command without any pre-configured scope." - }, - { - "description": "Denies the append command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-append", - "markdownDescription": "Denies the append command without any pre-configured scope." - }, - { - "description": "Denies the create_default command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-create-default", - "markdownDescription": "Denies the create_default command without any pre-configured scope." - }, - { - "description": "Denies the get command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-get", - "markdownDescription": "Denies the get command without any pre-configured scope." - }, - { - "description": "Denies the insert command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-insert", - "markdownDescription": "Denies the insert command without any pre-configured scope." - }, - { - "description": "Denies the is_checked command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-is-checked", - "markdownDescription": "Denies the is_checked command without any pre-configured scope." - }, - { - "description": "Denies the is_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-is-enabled", - "markdownDescription": "Denies the is_enabled command without any pre-configured scope." - }, - { - "description": "Denies the items command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-items", - "markdownDescription": "Denies the items command without any pre-configured scope." - }, - { - "description": "Denies the new command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-new", - "markdownDescription": "Denies the new command without any pre-configured scope." - }, - { - "description": "Denies the popup command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-popup", - "markdownDescription": "Denies the popup command without any pre-configured scope." - }, - { - "description": "Denies the prepend command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-prepend", - "markdownDescription": "Denies the prepend command without any pre-configured scope." - }, - { - "description": "Denies the remove command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-remove", - "markdownDescription": "Denies the remove command without any pre-configured scope." - }, - { - "description": "Denies the remove_at command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-remove-at", - "markdownDescription": "Denies the remove_at command without any pre-configured scope." - }, - { - "description": "Denies the set_accelerator command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-accelerator", - "markdownDescription": "Denies the set_accelerator command without any pre-configured scope." - }, - { - "description": "Denies the set_as_app_menu command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-as-app-menu", - "markdownDescription": "Denies the set_as_app_menu command without any pre-configured scope." - }, - { - "description": "Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-as-help-menu-for-nsapp", - "markdownDescription": "Denies the set_as_help_menu_for_nsapp command without any pre-configured scope." - }, - { - "description": "Denies the set_as_window_menu command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-as-window-menu", - "markdownDescription": "Denies the set_as_window_menu command without any pre-configured scope." - }, - { - "description": "Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-as-windows-menu-for-nsapp", - "markdownDescription": "Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope." - }, - { - "description": "Denies the set_checked command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-checked", - "markdownDescription": "Denies the set_checked command without any pre-configured scope." - }, - { - "description": "Denies the set_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-enabled", - "markdownDescription": "Denies the set_enabled command without any pre-configured scope." - }, - { - "description": "Denies the set_icon command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-icon", - "markdownDescription": "Denies the set_icon command without any pre-configured scope." - }, - { - "description": "Denies the set_text command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-text", - "markdownDescription": "Denies the set_text command without any pre-configured scope." - }, - { - "description": "Denies the text command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-text", - "markdownDescription": "Denies the text command without any pre-configured scope." - }, - { - "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-resolve-directory`\n- `allow-resolve`\n- `allow-normalize`\n- `allow-join`\n- `allow-dirname`\n- `allow-extname`\n- `allow-basename`\n- `allow-is-absolute`", - "type": "string", - "const": "core:path:default", - "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-resolve-directory`\n- `allow-resolve`\n- `allow-normalize`\n- `allow-join`\n- `allow-dirname`\n- `allow-extname`\n- `allow-basename`\n- `allow-is-absolute`" - }, - { - "description": "Enables the basename command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-basename", - "markdownDescription": "Enables the basename command without any pre-configured scope." - }, - { - "description": "Enables the dirname command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-dirname", - "markdownDescription": "Enables the dirname command without any pre-configured scope." - }, - { - "description": "Enables the extname command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-extname", - "markdownDescription": "Enables the extname command without any pre-configured scope." - }, - { - "description": "Enables the is_absolute command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-is-absolute", - "markdownDescription": "Enables the is_absolute command without any pre-configured scope." - }, - { - "description": "Enables the join command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-join", - "markdownDescription": "Enables the join command without any pre-configured scope." - }, - { - "description": "Enables the normalize command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-normalize", - "markdownDescription": "Enables the normalize command without any pre-configured scope." - }, - { - "description": "Enables the resolve command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-resolve", - "markdownDescription": "Enables the resolve command without any pre-configured scope." - }, - { - "description": "Enables the resolve_directory command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-resolve-directory", - "markdownDescription": "Enables the resolve_directory command without any pre-configured scope." - }, - { - "description": "Denies the basename command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-basename", - "markdownDescription": "Denies the basename command without any pre-configured scope." - }, - { - "description": "Denies the dirname command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-dirname", - "markdownDescription": "Denies the dirname command without any pre-configured scope." - }, - { - "description": "Denies the extname command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-extname", - "markdownDescription": "Denies the extname command without any pre-configured scope." - }, - { - "description": "Denies the is_absolute command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-is-absolute", - "markdownDescription": "Denies the is_absolute command without any pre-configured scope." - }, - { - "description": "Denies the join command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-join", - "markdownDescription": "Denies the join command without any pre-configured scope." - }, - { - "description": "Denies the normalize command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-normalize", - "markdownDescription": "Denies the normalize command without any pre-configured scope." - }, - { - "description": "Denies the resolve command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-resolve", - "markdownDescription": "Denies the resolve command without any pre-configured scope." - }, - { - "description": "Denies the resolve_directory command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-resolve-directory", - "markdownDescription": "Denies the resolve_directory command without any pre-configured scope." - }, - { - "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-close`", - "type": "string", - "const": "core:resources:default", - "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-close`" - }, - { - "description": "Enables the close command without any pre-configured scope.", - "type": "string", - "const": "core:resources:allow-close", - "markdownDescription": "Enables the close command without any pre-configured scope." - }, - { - "description": "Denies the close command without any pre-configured scope.", - "type": "string", - "const": "core:resources:deny-close", - "markdownDescription": "Denies the close command without any pre-configured scope." - }, - { - "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-get-by-id`\n- `allow-remove-by-id`\n- `allow-set-icon`\n- `allow-set-menu`\n- `allow-set-tooltip`\n- `allow-set-title`\n- `allow-set-visible`\n- `allow-set-temp-dir-path`\n- `allow-set-icon-as-template`\n- `allow-set-show-menu-on-left-click`", - "type": "string", - "const": "core:tray:default", - "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-get-by-id`\n- `allow-remove-by-id`\n- `allow-set-icon`\n- `allow-set-menu`\n- `allow-set-tooltip`\n- `allow-set-title`\n- `allow-set-visible`\n- `allow-set-temp-dir-path`\n- `allow-set-icon-as-template`\n- `allow-set-show-menu-on-left-click`" - }, - { - "description": "Enables the get_by_id command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-get-by-id", - "markdownDescription": "Enables the get_by_id command without any pre-configured scope." - }, - { - "description": "Enables the new command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-new", - "markdownDescription": "Enables the new command without any pre-configured scope." - }, - { - "description": "Enables the remove_by_id command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-remove-by-id", - "markdownDescription": "Enables the remove_by_id command without any pre-configured scope." - }, - { - "description": "Enables the set_icon command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-icon", - "markdownDescription": "Enables the set_icon command without any pre-configured scope." - }, - { - "description": "Enables the set_icon_as_template command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-icon-as-template", - "markdownDescription": "Enables the set_icon_as_template command without any pre-configured scope." - }, - { - "description": "Enables the set_menu command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-menu", - "markdownDescription": "Enables the set_menu command without any pre-configured scope." - }, - { - "description": "Enables the set_show_menu_on_left_click command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-show-menu-on-left-click", - "markdownDescription": "Enables the set_show_menu_on_left_click command without any pre-configured scope." - }, - { - "description": "Enables the set_temp_dir_path command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-temp-dir-path", - "markdownDescription": "Enables the set_temp_dir_path command without any pre-configured scope." - }, - { - "description": "Enables the set_title command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-title", - "markdownDescription": "Enables the set_title command without any pre-configured scope." - }, - { - "description": "Enables the set_tooltip command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-tooltip", - "markdownDescription": "Enables the set_tooltip command without any pre-configured scope." - }, - { - "description": "Enables the set_visible command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-visible", - "markdownDescription": "Enables the set_visible command without any pre-configured scope." - }, - { - "description": "Denies the get_by_id command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-get-by-id", - "markdownDescription": "Denies the get_by_id command without any pre-configured scope." - }, - { - "description": "Denies the new command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-new", - "markdownDescription": "Denies the new command without any pre-configured scope." - }, - { - "description": "Denies the remove_by_id command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-remove-by-id", - "markdownDescription": "Denies the remove_by_id command without any pre-configured scope." - }, - { - "description": "Denies the set_icon command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-icon", - "markdownDescription": "Denies the set_icon command without any pre-configured scope." - }, - { - "description": "Denies the set_icon_as_template command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-icon-as-template", - "markdownDescription": "Denies the set_icon_as_template command without any pre-configured scope." - }, - { - "description": "Denies the set_menu command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-menu", - "markdownDescription": "Denies the set_menu command without any pre-configured scope." - }, - { - "description": "Denies the set_show_menu_on_left_click command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-show-menu-on-left-click", - "markdownDescription": "Denies the set_show_menu_on_left_click command without any pre-configured scope." - }, - { - "description": "Denies the set_temp_dir_path command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-temp-dir-path", - "markdownDescription": "Denies the set_temp_dir_path command without any pre-configured scope." - }, - { - "description": "Denies the set_title command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-title", - "markdownDescription": "Denies the set_title command without any pre-configured scope." - }, - { - "description": "Denies the set_tooltip command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-tooltip", - "markdownDescription": "Denies the set_tooltip command without any pre-configured scope." - }, - { - "description": "Denies the set_visible command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-visible", - "markdownDescription": "Denies the set_visible command without any pre-configured scope." - }, - { - "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-webviews`\n- `allow-webview-position`\n- `allow-webview-size`\n- `allow-internal-toggle-devtools`", - "type": "string", - "const": "core:webview:default", - "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-webviews`\n- `allow-webview-position`\n- `allow-webview-size`\n- `allow-internal-toggle-devtools`" - }, - { - "description": "Enables the clear_all_browsing_data command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-clear-all-browsing-data", - "markdownDescription": "Enables the clear_all_browsing_data command without any pre-configured scope." - }, - { - "description": "Enables the create_webview command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-create-webview", - "markdownDescription": "Enables the create_webview command without any pre-configured scope." - }, - { - "description": "Enables the create_webview_window command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-create-webview-window", - "markdownDescription": "Enables the create_webview_window command without any pre-configured scope." - }, - { - "description": "Enables the get_all_webviews command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-get-all-webviews", - "markdownDescription": "Enables the get_all_webviews command without any pre-configured scope." - }, - { - "description": "Enables the internal_toggle_devtools command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-internal-toggle-devtools", - "markdownDescription": "Enables the internal_toggle_devtools command without any pre-configured scope." - }, - { - "description": "Enables the print command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-print", - "markdownDescription": "Enables the print command without any pre-configured scope." - }, - { - "description": "Enables the reparent command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-reparent", - "markdownDescription": "Enables the reparent command without any pre-configured scope." - }, - { - "description": "Enables the set_webview_background_color command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-set-webview-background-color", - "markdownDescription": "Enables the set_webview_background_color command without any pre-configured scope." - }, - { - "description": "Enables the set_webview_focus command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-set-webview-focus", - "markdownDescription": "Enables the set_webview_focus command without any pre-configured scope." - }, - { - "description": "Enables the set_webview_position command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-set-webview-position", - "markdownDescription": "Enables the set_webview_position command without any pre-configured scope." - }, - { - "description": "Enables the set_webview_size command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-set-webview-size", - "markdownDescription": "Enables the set_webview_size command without any pre-configured scope." - }, - { - "description": "Enables the set_webview_zoom command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-set-webview-zoom", - "markdownDescription": "Enables the set_webview_zoom command without any pre-configured scope." - }, - { - "description": "Enables the webview_close command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-webview-close", - "markdownDescription": "Enables the webview_close command without any pre-configured scope." - }, - { - "description": "Enables the webview_hide command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-webview-hide", - "markdownDescription": "Enables the webview_hide command without any pre-configured scope." - }, - { - "description": "Enables the webview_position command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-webview-position", - "markdownDescription": "Enables the webview_position command without any pre-configured scope." - }, - { - "description": "Enables the webview_show command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-webview-show", - "markdownDescription": "Enables the webview_show command without any pre-configured scope." - }, - { - "description": "Enables the webview_size command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-webview-size", - "markdownDescription": "Enables the webview_size command without any pre-configured scope." - }, - { - "description": "Denies the clear_all_browsing_data command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-clear-all-browsing-data", - "markdownDescription": "Denies the clear_all_browsing_data command without any pre-configured scope." - }, - { - "description": "Denies the create_webview command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-create-webview", - "markdownDescription": "Denies the create_webview command without any pre-configured scope." - }, - { - "description": "Denies the create_webview_window command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-create-webview-window", - "markdownDescription": "Denies the create_webview_window command without any pre-configured scope." - }, - { - "description": "Denies the get_all_webviews command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-get-all-webviews", - "markdownDescription": "Denies the get_all_webviews command without any pre-configured scope." - }, - { - "description": "Denies the internal_toggle_devtools command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-internal-toggle-devtools", - "markdownDescription": "Denies the internal_toggle_devtools command without any pre-configured scope." - }, - { - "description": "Denies the print command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-print", - "markdownDescription": "Denies the print command without any pre-configured scope." - }, - { - "description": "Denies the reparent command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-reparent", - "markdownDescription": "Denies the reparent command without any pre-configured scope." - }, - { - "description": "Denies the set_webview_background_color command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-set-webview-background-color", - "markdownDescription": "Denies the set_webview_background_color command without any pre-configured scope." - }, - { - "description": "Denies the set_webview_focus command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-set-webview-focus", - "markdownDescription": "Denies the set_webview_focus command without any pre-configured scope." - }, - { - "description": "Denies the set_webview_position command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-set-webview-position", - "markdownDescription": "Denies the set_webview_position command without any pre-configured scope." - }, - { - "description": "Denies the set_webview_size command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-set-webview-size", - "markdownDescription": "Denies the set_webview_size command without any pre-configured scope." - }, - { - "description": "Denies the set_webview_zoom command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-set-webview-zoom", - "markdownDescription": "Denies the set_webview_zoom command without any pre-configured scope." - }, - { - "description": "Denies the webview_close command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-webview-close", - "markdownDescription": "Denies the webview_close command without any pre-configured scope." - }, - { - "description": "Denies the webview_hide command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-webview-hide", - "markdownDescription": "Denies the webview_hide command without any pre-configured scope." - }, - { - "description": "Denies the webview_position command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-webview-position", - "markdownDescription": "Denies the webview_position command without any pre-configured scope." - }, - { - "description": "Denies the webview_show command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-webview-show", - "markdownDescription": "Denies the webview_show command without any pre-configured scope." - }, - { - "description": "Denies the webview_size command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-webview-size", - "markdownDescription": "Denies the webview_size command without any pre-configured scope." - }, - { - "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-windows`\n- `allow-scale-factor`\n- `allow-inner-position`\n- `allow-outer-position`\n- `allow-inner-size`\n- `allow-outer-size`\n- `allow-is-fullscreen`\n- `allow-is-minimized`\n- `allow-is-maximized`\n- `allow-is-focused`\n- `allow-is-decorated`\n- `allow-is-resizable`\n- `allow-is-maximizable`\n- `allow-is-minimizable`\n- `allow-is-closable`\n- `allow-is-visible`\n- `allow-is-enabled`\n- `allow-title`\n- `allow-current-monitor`\n- `allow-primary-monitor`\n- `allow-monitor-from-point`\n- `allow-available-monitors`\n- `allow-cursor-position`\n- `allow-theme`\n- `allow-is-always-on-top`\n- `allow-internal-toggle-maximize`", - "type": "string", - "const": "core:window:default", - "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-windows`\n- `allow-scale-factor`\n- `allow-inner-position`\n- `allow-outer-position`\n- `allow-inner-size`\n- `allow-outer-size`\n- `allow-is-fullscreen`\n- `allow-is-minimized`\n- `allow-is-maximized`\n- `allow-is-focused`\n- `allow-is-decorated`\n- `allow-is-resizable`\n- `allow-is-maximizable`\n- `allow-is-minimizable`\n- `allow-is-closable`\n- `allow-is-visible`\n- `allow-is-enabled`\n- `allow-title`\n- `allow-current-monitor`\n- `allow-primary-monitor`\n- `allow-monitor-from-point`\n- `allow-available-monitors`\n- `allow-cursor-position`\n- `allow-theme`\n- `allow-is-always-on-top`\n- `allow-internal-toggle-maximize`" - }, - { - "description": "Enables the available_monitors command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-available-monitors", - "markdownDescription": "Enables the available_monitors command without any pre-configured scope." - }, - { - "description": "Enables the center command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-center", - "markdownDescription": "Enables the center command without any pre-configured scope." - }, - { - "description": "Enables the close command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-close", - "markdownDescription": "Enables the close command without any pre-configured scope." - }, - { - "description": "Enables the create command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-create", - "markdownDescription": "Enables the create command without any pre-configured scope." - }, - { - "description": "Enables the current_monitor command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-current-monitor", - "markdownDescription": "Enables the current_monitor command without any pre-configured scope." - }, - { - "description": "Enables the cursor_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-cursor-position", - "markdownDescription": "Enables the cursor_position command without any pre-configured scope." - }, - { - "description": "Enables the destroy command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-destroy", - "markdownDescription": "Enables the destroy command without any pre-configured scope." - }, - { - "description": "Enables the get_all_windows command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-get-all-windows", - "markdownDescription": "Enables the get_all_windows command without any pre-configured scope." - }, - { - "description": "Enables the hide command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-hide", - "markdownDescription": "Enables the hide command without any pre-configured scope." - }, - { - "description": "Enables the inner_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-inner-position", - "markdownDescription": "Enables the inner_position command without any pre-configured scope." - }, - { - "description": "Enables the inner_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-inner-size", - "markdownDescription": "Enables the inner_size command without any pre-configured scope." - }, - { - "description": "Enables the internal_toggle_maximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-internal-toggle-maximize", - "markdownDescription": "Enables the internal_toggle_maximize command without any pre-configured scope." - }, - { - "description": "Enables the is_always_on_top command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-always-on-top", - "markdownDescription": "Enables the is_always_on_top command without any pre-configured scope." - }, - { - "description": "Enables the is_closable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-closable", - "markdownDescription": "Enables the is_closable command without any pre-configured scope." - }, - { - "description": "Enables the is_decorated command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-decorated", - "markdownDescription": "Enables the is_decorated command without any pre-configured scope." - }, - { - "description": "Enables the is_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-enabled", - "markdownDescription": "Enables the is_enabled command without any pre-configured scope." - }, - { - "description": "Enables the is_focused command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-focused", - "markdownDescription": "Enables the is_focused command without any pre-configured scope." - }, - { - "description": "Enables the is_fullscreen command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-fullscreen", - "markdownDescription": "Enables the is_fullscreen command without any pre-configured scope." - }, - { - "description": "Enables the is_maximizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-maximizable", - "markdownDescription": "Enables the is_maximizable command without any pre-configured scope." - }, - { - "description": "Enables the is_maximized command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-maximized", - "markdownDescription": "Enables the is_maximized command without any pre-configured scope." - }, - { - "description": "Enables the is_minimizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-minimizable", - "markdownDescription": "Enables the is_minimizable command without any pre-configured scope." - }, - { - "description": "Enables the is_minimized command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-minimized", - "markdownDescription": "Enables the is_minimized command without any pre-configured scope." - }, - { - "description": "Enables the is_resizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-resizable", - "markdownDescription": "Enables the is_resizable command without any pre-configured scope." - }, - { - "description": "Enables the is_visible command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-visible", - "markdownDescription": "Enables the is_visible command without any pre-configured scope." - }, - { - "description": "Enables the maximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-maximize", - "markdownDescription": "Enables the maximize command without any pre-configured scope." - }, - { - "description": "Enables the minimize command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-minimize", - "markdownDescription": "Enables the minimize command without any pre-configured scope." - }, - { - "description": "Enables the monitor_from_point command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-monitor-from-point", - "markdownDescription": "Enables the monitor_from_point command without any pre-configured scope." - }, - { - "description": "Enables the outer_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-outer-position", - "markdownDescription": "Enables the outer_position command without any pre-configured scope." - }, - { - "description": "Enables the outer_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-outer-size", - "markdownDescription": "Enables the outer_size command without any pre-configured scope." - }, - { - "description": "Enables the primary_monitor command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-primary-monitor", - "markdownDescription": "Enables the primary_monitor command without any pre-configured scope." - }, - { - "description": "Enables the request_user_attention command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-request-user-attention", - "markdownDescription": "Enables the request_user_attention command without any pre-configured scope." - }, - { - "description": "Enables the scale_factor command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-scale-factor", - "markdownDescription": "Enables the scale_factor command without any pre-configured scope." - }, - { - "description": "Enables the set_always_on_bottom command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-always-on-bottom", - "markdownDescription": "Enables the set_always_on_bottom command without any pre-configured scope." - }, - { - "description": "Enables the set_always_on_top command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-always-on-top", - "markdownDescription": "Enables the set_always_on_top command without any pre-configured scope." - }, - { - "description": "Enables the set_background_color command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-background-color", - "markdownDescription": "Enables the set_background_color command without any pre-configured scope." - }, - { - "description": "Enables the set_badge_count command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-badge-count", - "markdownDescription": "Enables the set_badge_count command without any pre-configured scope." - }, - { - "description": "Enables the set_badge_label command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-badge-label", - "markdownDescription": "Enables the set_badge_label command without any pre-configured scope." - }, - { - "description": "Enables the set_closable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-closable", - "markdownDescription": "Enables the set_closable command without any pre-configured scope." - }, - { - "description": "Enables the set_content_protected command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-content-protected", - "markdownDescription": "Enables the set_content_protected command without any pre-configured scope." - }, - { - "description": "Enables the set_cursor_grab command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-cursor-grab", - "markdownDescription": "Enables the set_cursor_grab command without any pre-configured scope." - }, - { - "description": "Enables the set_cursor_icon command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-cursor-icon", - "markdownDescription": "Enables the set_cursor_icon command without any pre-configured scope." - }, - { - "description": "Enables the set_cursor_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-cursor-position", - "markdownDescription": "Enables the set_cursor_position command without any pre-configured scope." - }, - { - "description": "Enables the set_cursor_visible command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-cursor-visible", - "markdownDescription": "Enables the set_cursor_visible command without any pre-configured scope." - }, - { - "description": "Enables the set_decorations command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-decorations", - "markdownDescription": "Enables the set_decorations command without any pre-configured scope." - }, - { - "description": "Enables the set_effects command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-effects", - "markdownDescription": "Enables the set_effects command without any pre-configured scope." - }, - { - "description": "Enables the set_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-enabled", - "markdownDescription": "Enables the set_enabled command without any pre-configured scope." - }, - { - "description": "Enables the set_focus command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-focus", - "markdownDescription": "Enables the set_focus command without any pre-configured scope." - }, - { - "description": "Enables the set_fullscreen command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-fullscreen", - "markdownDescription": "Enables the set_fullscreen command without any pre-configured scope." - }, - { - "description": "Enables the set_icon command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-icon", - "markdownDescription": "Enables the set_icon command without any pre-configured scope." - }, - { - "description": "Enables the set_ignore_cursor_events command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-ignore-cursor-events", - "markdownDescription": "Enables the set_ignore_cursor_events command without any pre-configured scope." - }, - { - "description": "Enables the set_max_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-max-size", - "markdownDescription": "Enables the set_max_size command without any pre-configured scope." - }, - { - "description": "Enables the set_maximizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-maximizable", - "markdownDescription": "Enables the set_maximizable command without any pre-configured scope." - }, - { - "description": "Enables the set_min_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-min-size", - "markdownDescription": "Enables the set_min_size command without any pre-configured scope." - }, - { - "description": "Enables the set_minimizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-minimizable", - "markdownDescription": "Enables the set_minimizable command without any pre-configured scope." - }, - { - "description": "Enables the set_overlay_icon command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-overlay-icon", - "markdownDescription": "Enables the set_overlay_icon command without any pre-configured scope." - }, - { - "description": "Enables the set_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-position", - "markdownDescription": "Enables the set_position command without any pre-configured scope." - }, - { - "description": "Enables the set_progress_bar command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-progress-bar", - "markdownDescription": "Enables the set_progress_bar command without any pre-configured scope." - }, - { - "description": "Enables the set_resizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-resizable", - "markdownDescription": "Enables the set_resizable command without any pre-configured scope." - }, - { - "description": "Enables the set_shadow command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-shadow", - "markdownDescription": "Enables the set_shadow command without any pre-configured scope." - }, - { - "description": "Enables the set_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-size", - "markdownDescription": "Enables the set_size command without any pre-configured scope." - }, - { - "description": "Enables the set_size_constraints command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-size-constraints", - "markdownDescription": "Enables the set_size_constraints command without any pre-configured scope." - }, - { - "description": "Enables the set_skip_taskbar command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-skip-taskbar", - "markdownDescription": "Enables the set_skip_taskbar command without any pre-configured scope." - }, - { - "description": "Enables the set_theme command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-theme", - "markdownDescription": "Enables the set_theme command without any pre-configured scope." - }, - { - "description": "Enables the set_title command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-title", - "markdownDescription": "Enables the set_title command without any pre-configured scope." - }, - { - "description": "Enables the set_title_bar_style command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-title-bar-style", - "markdownDescription": "Enables the set_title_bar_style command without any pre-configured scope." - }, - { - "description": "Enables the set_visible_on_all_workspaces command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-visible-on-all-workspaces", - "markdownDescription": "Enables the set_visible_on_all_workspaces command without any pre-configured scope." - }, - { - "description": "Enables the show command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-show", - "markdownDescription": "Enables the show command without any pre-configured scope." - }, - { - "description": "Enables the start_dragging command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-start-dragging", - "markdownDescription": "Enables the start_dragging command without any pre-configured scope." - }, - { - "description": "Enables the start_resize_dragging command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-start-resize-dragging", - "markdownDescription": "Enables the start_resize_dragging command without any pre-configured scope." - }, - { - "description": "Enables the theme command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-theme", - "markdownDescription": "Enables the theme command without any pre-configured scope." - }, - { - "description": "Enables the title command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-title", - "markdownDescription": "Enables the title command without any pre-configured scope." - }, - { - "description": "Enables the toggle_maximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-toggle-maximize", - "markdownDescription": "Enables the toggle_maximize command without any pre-configured scope." - }, - { - "description": "Enables the unmaximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-unmaximize", - "markdownDescription": "Enables the unmaximize command without any pre-configured scope." - }, - { - "description": "Enables the unminimize command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-unminimize", - "markdownDescription": "Enables the unminimize command without any pre-configured scope." - }, - { - "description": "Denies the available_monitors command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-available-monitors", - "markdownDescription": "Denies the available_monitors command without any pre-configured scope." - }, - { - "description": "Denies the center command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-center", - "markdownDescription": "Denies the center command without any pre-configured scope." - }, - { - "description": "Denies the close command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-close", - "markdownDescription": "Denies the close command without any pre-configured scope." - }, - { - "description": "Denies the create command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-create", - "markdownDescription": "Denies the create command without any pre-configured scope." - }, - { - "description": "Denies the current_monitor command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-current-monitor", - "markdownDescription": "Denies the current_monitor command without any pre-configured scope." - }, - { - "description": "Denies the cursor_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-cursor-position", - "markdownDescription": "Denies the cursor_position command without any pre-configured scope." - }, - { - "description": "Denies the destroy command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-destroy", - "markdownDescription": "Denies the destroy command without any pre-configured scope." - }, - { - "description": "Denies the get_all_windows command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-get-all-windows", - "markdownDescription": "Denies the get_all_windows command without any pre-configured scope." - }, - { - "description": "Denies the hide command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-hide", - "markdownDescription": "Denies the hide command without any pre-configured scope." - }, - { - "description": "Denies the inner_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-inner-position", - "markdownDescription": "Denies the inner_position command without any pre-configured scope." - }, - { - "description": "Denies the inner_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-inner-size", - "markdownDescription": "Denies the inner_size command without any pre-configured scope." - }, - { - "description": "Denies the internal_toggle_maximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-internal-toggle-maximize", - "markdownDescription": "Denies the internal_toggle_maximize command without any pre-configured scope." - }, - { - "description": "Denies the is_always_on_top command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-always-on-top", - "markdownDescription": "Denies the is_always_on_top command without any pre-configured scope." - }, - { - "description": "Denies the is_closable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-closable", - "markdownDescription": "Denies the is_closable command without any pre-configured scope." - }, - { - "description": "Denies the is_decorated command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-decorated", - "markdownDescription": "Denies the is_decorated command without any pre-configured scope." - }, - { - "description": "Denies the is_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-enabled", - "markdownDescription": "Denies the is_enabled command without any pre-configured scope." - }, - { - "description": "Denies the is_focused command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-focused", - "markdownDescription": "Denies the is_focused command without any pre-configured scope." - }, - { - "description": "Denies the is_fullscreen command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-fullscreen", - "markdownDescription": "Denies the is_fullscreen command without any pre-configured scope." - }, - { - "description": "Denies the is_maximizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-maximizable", - "markdownDescription": "Denies the is_maximizable command without any pre-configured scope." - }, - { - "description": "Denies the is_maximized command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-maximized", - "markdownDescription": "Denies the is_maximized command without any pre-configured scope." - }, - { - "description": "Denies the is_minimizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-minimizable", - "markdownDescription": "Denies the is_minimizable command without any pre-configured scope." - }, - { - "description": "Denies the is_minimized command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-minimized", - "markdownDescription": "Denies the is_minimized command without any pre-configured scope." - }, - { - "description": "Denies the is_resizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-resizable", - "markdownDescription": "Denies the is_resizable command without any pre-configured scope." - }, - { - "description": "Denies the is_visible command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-visible", - "markdownDescription": "Denies the is_visible command without any pre-configured scope." - }, - { - "description": "Denies the maximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-maximize", - "markdownDescription": "Denies the maximize command without any pre-configured scope." - }, - { - "description": "Denies the minimize command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-minimize", - "markdownDescription": "Denies the minimize command without any pre-configured scope." - }, - { - "description": "Denies the monitor_from_point command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-monitor-from-point", - "markdownDescription": "Denies the monitor_from_point command without any pre-configured scope." - }, - { - "description": "Denies the outer_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-outer-position", - "markdownDescription": "Denies the outer_position command without any pre-configured scope." - }, - { - "description": "Denies the outer_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-outer-size", - "markdownDescription": "Denies the outer_size command without any pre-configured scope." - }, - { - "description": "Denies the primary_monitor command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-primary-monitor", - "markdownDescription": "Denies the primary_monitor command without any pre-configured scope." - }, - { - "description": "Denies the request_user_attention command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-request-user-attention", - "markdownDescription": "Denies the request_user_attention command without any pre-configured scope." - }, - { - "description": "Denies the scale_factor command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-scale-factor", - "markdownDescription": "Denies the scale_factor command without any pre-configured scope." - }, - { - "description": "Denies the set_always_on_bottom command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-always-on-bottom", - "markdownDescription": "Denies the set_always_on_bottom command without any pre-configured scope." - }, - { - "description": "Denies the set_always_on_top command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-always-on-top", - "markdownDescription": "Denies the set_always_on_top command without any pre-configured scope." - }, - { - "description": "Denies the set_background_color command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-background-color", - "markdownDescription": "Denies the set_background_color command without any pre-configured scope." - }, - { - "description": "Denies the set_badge_count command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-badge-count", - "markdownDescription": "Denies the set_badge_count command without any pre-configured scope." - }, - { - "description": "Denies the set_badge_label command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-badge-label", - "markdownDescription": "Denies the set_badge_label command without any pre-configured scope." - }, - { - "description": "Denies the set_closable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-closable", - "markdownDescription": "Denies the set_closable command without any pre-configured scope." - }, - { - "description": "Denies the set_content_protected command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-content-protected", - "markdownDescription": "Denies the set_content_protected command without any pre-configured scope." - }, - { - "description": "Denies the set_cursor_grab command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-cursor-grab", - "markdownDescription": "Denies the set_cursor_grab command without any pre-configured scope." - }, - { - "description": "Denies the set_cursor_icon command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-cursor-icon", - "markdownDescription": "Denies the set_cursor_icon command without any pre-configured scope." - }, - { - "description": "Denies the set_cursor_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-cursor-position", - "markdownDescription": "Denies the set_cursor_position command without any pre-configured scope." - }, - { - "description": "Denies the set_cursor_visible command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-cursor-visible", - "markdownDescription": "Denies the set_cursor_visible command without any pre-configured scope." - }, - { - "description": "Denies the set_decorations command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-decorations", - "markdownDescription": "Denies the set_decorations command without any pre-configured scope." - }, - { - "description": "Denies the set_effects command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-effects", - "markdownDescription": "Denies the set_effects command without any pre-configured scope." - }, - { - "description": "Denies the set_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-enabled", - "markdownDescription": "Denies the set_enabled command without any pre-configured scope." - }, - { - "description": "Denies the set_focus command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-focus", - "markdownDescription": "Denies the set_focus command without any pre-configured scope." - }, - { - "description": "Denies the set_fullscreen command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-fullscreen", - "markdownDescription": "Denies the set_fullscreen command without any pre-configured scope." - }, - { - "description": "Denies the set_icon command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-icon", - "markdownDescription": "Denies the set_icon command without any pre-configured scope." - }, - { - "description": "Denies the set_ignore_cursor_events command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-ignore-cursor-events", - "markdownDescription": "Denies the set_ignore_cursor_events command without any pre-configured scope." - }, - { - "description": "Denies the set_max_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-max-size", - "markdownDescription": "Denies the set_max_size command without any pre-configured scope." - }, - { - "description": "Denies the set_maximizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-maximizable", - "markdownDescription": "Denies the set_maximizable command without any pre-configured scope." - }, - { - "description": "Denies the set_min_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-min-size", - "markdownDescription": "Denies the set_min_size command without any pre-configured scope." - }, - { - "description": "Denies the set_minimizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-minimizable", - "markdownDescription": "Denies the set_minimizable command without any pre-configured scope." - }, - { - "description": "Denies the set_overlay_icon command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-overlay-icon", - "markdownDescription": "Denies the set_overlay_icon command without any pre-configured scope." - }, - { - "description": "Denies the set_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-position", - "markdownDescription": "Denies the set_position command without any pre-configured scope." - }, - { - "description": "Denies the set_progress_bar command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-progress-bar", - "markdownDescription": "Denies the set_progress_bar command without any pre-configured scope." - }, - { - "description": "Denies the set_resizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-resizable", - "markdownDescription": "Denies the set_resizable command without any pre-configured scope." - }, - { - "description": "Denies the set_shadow command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-shadow", - "markdownDescription": "Denies the set_shadow command without any pre-configured scope." - }, - { - "description": "Denies the set_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-size", - "markdownDescription": "Denies the set_size command without any pre-configured scope." - }, - { - "description": "Denies the set_size_constraints command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-size-constraints", - "markdownDescription": "Denies the set_size_constraints command without any pre-configured scope." - }, - { - "description": "Denies the set_skip_taskbar command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-skip-taskbar", - "markdownDescription": "Denies the set_skip_taskbar command without any pre-configured scope." - }, - { - "description": "Denies the set_theme command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-theme", - "markdownDescription": "Denies the set_theme command without any pre-configured scope." - }, - { - "description": "Denies the set_title command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-title", - "markdownDescription": "Denies the set_title command without any pre-configured scope." - }, - { - "description": "Denies the set_title_bar_style command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-title-bar-style", - "markdownDescription": "Denies the set_title_bar_style command without any pre-configured scope." - }, - { - "description": "Denies the set_visible_on_all_workspaces command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-visible-on-all-workspaces", - "markdownDescription": "Denies the set_visible_on_all_workspaces command without any pre-configured scope." - }, - { - "description": "Denies the show command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-show", - "markdownDescription": "Denies the show command without any pre-configured scope." - }, - { - "description": "Denies the start_dragging command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-start-dragging", - "markdownDescription": "Denies the start_dragging command without any pre-configured scope." - }, - { - "description": "Denies the start_resize_dragging command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-start-resize-dragging", - "markdownDescription": "Denies the start_resize_dragging command without any pre-configured scope." - }, - { - "description": "Denies the theme command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-theme", - "markdownDescription": "Denies the theme command without any pre-configured scope." - }, - { - "description": "Denies the title command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-title", - "markdownDescription": "Denies the title command without any pre-configured scope." - }, - { - "description": "Denies the toggle_maximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-toggle-maximize", - "markdownDescription": "Denies the toggle_maximize command without any pre-configured scope." - }, - { - "description": "Denies the unmaximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-unmaximize", - "markdownDescription": "Denies the unmaximize command without any pre-configured scope." - }, - { - "description": "Denies the unminimize command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-unminimize", - "markdownDescription": "Denies the unminimize command without any pre-configured scope." - }, - { - "description": "This permission set configures what kind of\nfetch operations are available from the http plugin.\n\nThis enables all fetch operations but does not\nallow explicitly any origins to be fetched. This needs to\nbe manually configured before usage.\n\n#### Granted Permissions\n\nAll fetch operations are enabled.\n\n\n#### This default permission set includes:\n\n- `allow-fetch`\n- `allow-fetch-cancel`\n- `allow-fetch-read-body`\n- `allow-fetch-send`", - "type": "string", - "const": "http:default", - "markdownDescription": "This permission set configures what kind of\nfetch operations are available from the http plugin.\n\nThis enables all fetch operations but does not\nallow explicitly any origins to be fetched. This needs to\nbe manually configured before usage.\n\n#### Granted Permissions\n\nAll fetch operations are enabled.\n\n\n#### This default permission set includes:\n\n- `allow-fetch`\n- `allow-fetch-cancel`\n- `allow-fetch-read-body`\n- `allow-fetch-send`" - }, - { - "description": "Enables the fetch command without any pre-configured scope.", - "type": "string", - "const": "http:allow-fetch", - "markdownDescription": "Enables the fetch command without any pre-configured scope." - }, - { - "description": "Enables the fetch_cancel command without any pre-configured scope.", - "type": "string", - "const": "http:allow-fetch-cancel", - "markdownDescription": "Enables the fetch_cancel command without any pre-configured scope." - }, - { - "description": "Enables the fetch_read_body command without any pre-configured scope.", - "type": "string", - "const": "http:allow-fetch-read-body", - "markdownDescription": "Enables the fetch_read_body command without any pre-configured scope." - }, - { - "description": "Enables the fetch_send command without any pre-configured scope.", - "type": "string", - "const": "http:allow-fetch-send", - "markdownDescription": "Enables the fetch_send command without any pre-configured scope." - }, - { - "description": "Denies the fetch command without any pre-configured scope.", - "type": "string", - "const": "http:deny-fetch", - "markdownDescription": "Denies the fetch command without any pre-configured scope." - }, - { - "description": "Denies the fetch_cancel command without any pre-configured scope.", - "type": "string", - "const": "http:deny-fetch-cancel", - "markdownDescription": "Denies the fetch_cancel command without any pre-configured scope." - }, - { - "description": "Denies the fetch_read_body command without any pre-configured scope.", - "type": "string", - "const": "http:deny-fetch-read-body", - "markdownDescription": "Denies the fetch_read_body command without any pre-configured scope." - }, - { - "description": "Denies the fetch_send command without any pre-configured scope.", - "type": "string", - "const": "http:deny-fetch-send", - "markdownDescription": "Denies the fetch_send command without any pre-configured scope." - }, - { - "description": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`", - "type": "string", - "const": "shell:default", - "markdownDescription": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`" - }, - { - "description": "Enables the execute command without any pre-configured scope.", - "type": "string", - "const": "shell:allow-execute", - "markdownDescription": "Enables the execute command without any pre-configured scope." - }, - { - "description": "Enables the kill command without any pre-configured scope.", - "type": "string", - "const": "shell:allow-kill", - "markdownDescription": "Enables the kill command without any pre-configured scope." - }, - { - "description": "Enables the open command without any pre-configured scope.", - "type": "string", - "const": "shell:allow-open", - "markdownDescription": "Enables the open command without any pre-configured scope." - }, - { - "description": "Enables the spawn command without any pre-configured scope.", - "type": "string", - "const": "shell:allow-spawn", - "markdownDescription": "Enables the spawn command without any pre-configured scope." - }, - { - "description": "Enables the stdin_write command without any pre-configured scope.", - "type": "string", - "const": "shell:allow-stdin-write", - "markdownDescription": "Enables the stdin_write command without any pre-configured scope." - }, - { - "description": "Denies the execute command without any pre-configured scope.", - "type": "string", - "const": "shell:deny-execute", - "markdownDescription": "Denies the execute command without any pre-configured scope." - }, - { - "description": "Denies the kill command without any pre-configured scope.", - "type": "string", - "const": "shell:deny-kill", - "markdownDescription": "Denies the kill command without any pre-configured scope." - }, - { - "description": "Denies the open command without any pre-configured scope.", - "type": "string", - "const": "shell:deny-open", - "markdownDescription": "Denies the open command without any pre-configured scope." - }, - { - "description": "Denies the spawn command without any pre-configured scope.", - "type": "string", - "const": "shell:deny-spawn", - "markdownDescription": "Denies the spawn command without any pre-configured scope." - }, - { - "description": "Denies the stdin_write command without any pre-configured scope.", - "type": "string", - "const": "shell:deny-stdin-write", - "markdownDescription": "Denies the stdin_write command without any pre-configured scope." - } - ] - }, - "Value": { - "description": "All supported ACL values.", - "anyOf": [ - { - "description": "Represents a null JSON value.", - "type": "null" - }, - { - "description": "Represents a [`bool`].", - "type": "boolean" - }, - { - "description": "Represents a valid ACL [`Number`].", - "allOf": [ - { - "$ref": "#/definitions/Number" - } - ] - }, - { - "description": "Represents a [`String`].", - "type": "string" - }, - { - "description": "Represents a list of other [`Value`]s.", - "type": "array", - "items": { - "$ref": "#/definitions/Value" - } - }, - { - "description": "Represents a map of [`String`] keys to [`Value`]s.", - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/Value" - } - } - ] - }, - "Number": { - "description": "A valid ACL number.", - "anyOf": [ - { - "description": "Represents an [`i64`].", - "type": "integer", - "format": "int64" - }, - { - "description": "Represents a [`f64`].", - "type": "number", - "format": "double" - } - ] - }, - "Target": { - "description": "Platform target.", - "oneOf": [ - { - "description": "MacOS.", - "type": "string", - "enum": ["macOS"] - }, - { - "description": "Windows.", - "type": "string", - "enum": ["windows"] - }, - { - "description": "Linux.", - "type": "string", - "enum": ["linux"] - }, - { - "description": "Android.", - "type": "string", - "enum": ["android"] - }, - { - "description": "iOS.", - "type": "string", - "enum": ["iOS"] - } - ] - }, - "ShellScopeEntryAllowedArg": { - "description": "A command argument allowed to be executed by the webview API.", - "anyOf": [ - { - "description": "A non-configurable argument that is passed to the command in the order it was specified.", - "type": "string" - }, - { - "description": "A variable that is set while calling the command from the webview API.", - "type": "object", - "required": ["validator"], - "properties": { - "raw": { - "description": "Marks the validator as a raw regex, meaning the plugin should not make any modification at runtime.\n\nThis means the regex will not match on the entire string by default, which might be exploited if your regex allow unexpected input to be considered valid. When using this option, make sure your regex is correct.", - "default": false, - "type": "boolean" - }, - "validator": { - "description": "[regex] validator to require passed values to conform to an expected input.\n\nThis will require the argument value passed to this variable to match the `validator` regex before it will be executed.\n\nThe regex string is by default surrounded by `^...$` to match the full string. For example the `https?://\\w+` regex would be registered as `^https?://\\w+$`.\n\n[regex]: ", - "type": "string" - } - }, - "additionalProperties": false - } - ] - }, - "ShellScopeEntryAllowedArgs": { - "description": "A set of command arguments allowed to be executed by the webview API.\n\nA value of `true` will allow any arguments to be passed to the command. `false` will disable all arguments. A list of [`ShellScopeEntryAllowedArg`] will set those arguments as the only valid arguments to be passed to the attached command configuration.", - "anyOf": [ - { - "description": "Use a simple boolean to allow all or disable all arguments to this command configuration.", - "type": "boolean" - }, - { - "description": "A specific set of [`ShellScopeEntryAllowedArg`] that are valid to call for the command configuration.", - "type": "array", - "items": { - "$ref": "#/definitions/ShellScopeEntryAllowedArg" - } - } - ] - } - } -} diff --git a/frontend/src-tauri/gen/schemas/windows-schema.json b/frontend/src-tauri/gen/schemas/windows-schema.json deleted file mode 100644 index 5cedd90e1d..0000000000 --- a/frontend/src-tauri/gen/schemas/windows-schema.json +++ /dev/null @@ -1,2660 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "title": "CapabilityFile", - "description": "Capability formats accepted in a capability file.", - "anyOf": [ - { - "description": "A single capability.", - "allOf": [ - { - "$ref": "#/definitions/Capability" - } - ] - }, - { - "description": "A list of capabilities.", - "type": "array", - "items": { - "$ref": "#/definitions/Capability" - } - }, - { - "description": "A list of capabilities.", - "type": "object", - "required": [ - "capabilities" - ], - "properties": { - "capabilities": { - "description": "The list of capabilities.", - "type": "array", - "items": { - "$ref": "#/definitions/Capability" - } - } - } - } - ], - "definitions": { - "Capability": { - "description": "A grouping and boundary mechanism developers can use to isolate access to the IPC layer.\n\nIt controls application windows' and webviews' fine grained access to the Tauri core, application, or plugin commands. If a webview or its window is not matching any capability then it has no access to the IPC layer at all.\n\nThis can be done to create groups of windows, based on their required system access, which can reduce impact of frontend vulnerabilities in less privileged windows. Windows can be added to a capability by exact name (e.g. `main-window`) or glob patterns like `*` or `admin-*`. A Window can have none, one, or multiple associated capabilities.\n\n## Example\n\n```json { \"identifier\": \"main-user-files-write\", \"description\": \"This capability allows the `main` window on macOS and Windows access to `filesystem` write related commands and `dialog` commands to enable programatic access to files selected by the user.\", \"windows\": [ \"main\" ], \"permissions\": [ \"core:default\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] }, ], \"platforms\": [\"macOS\",\"windows\"] } ```", - "type": "object", - "required": [ - "identifier", - "permissions" - ], - "properties": { - "identifier": { - "description": "Identifier of the capability.\n\n## Example\n\n`main-user-files-write`", - "type": "string" - }, - "description": { - "description": "Description of what the capability is intended to allow on associated windows.\n\nIt should contain a description of what the grouped permissions should allow.\n\n## Example\n\nThis capability allows the `main` window access to `filesystem` write related commands and `dialog` commands to enable programatic access to files selected by the user.", - "default": "", - "type": "string" - }, - "remote": { - "description": "Configure remote URLs that can use the capability permissions.\n\nThis setting is optional and defaults to not being set, as our default use case is that the content is served from our local application.\n\n:::caution Make sure you understand the security implications of providing remote sources with local system access. :::\n\n## Example\n\n```json { \"urls\": [\"https://*.mydomain.dev\"] } ```", - "anyOf": [ - { - "$ref": "#/definitions/CapabilityRemote" - }, - { - "type": "null" - } - ] - }, - "local": { - "description": "Whether this capability is enabled for local app URLs or not. Defaults to `true`.", - "default": true, - "type": "boolean" - }, - "windows": { - "description": "List of windows that are affected by this capability. Can be a glob pattern.\n\nIf a window label matches any of the patterns in this list, the capability will be enabled on all the webviews of that window, regardless of the value of [`Self::webviews`].\n\nOn multiwebview windows, prefer specifying [`Self::webviews`] and omitting [`Self::windows`] for a fine grained access control.\n\n## Example\n\n`[\"main\"]`", - "type": "array", - "items": { - "type": "string" - } - }, - "webviews": { - "description": "List of webviews that are affected by this capability. Can be a glob pattern.\n\nThe capability will be enabled on all the webviews whose label matches any of the patterns in this list, regardless of whether the webview's window label matches a pattern in [`Self::windows`].\n\n## Example\n\n`[\"sub-webview-one\", \"sub-webview-two\"]`", - "type": "array", - "items": { - "type": "string" - } - }, - "permissions": { - "description": "List of permissions attached to this capability.\n\nMust include the plugin name as prefix in the form of `${plugin-name}:${permission-name}`. For commands directly implemented in the application itself only `${permission-name}` is required.\n\n## Example\n\n```json [ \"core:default\", \"shell:allow-open\", \"dialog:open\", { \"identifier\": \"fs:allow-write-text-file\", \"allow\": [{ \"path\": \"$HOME/test.txt\" }] } ] ```", - "type": "array", - "items": { - "$ref": "#/definitions/PermissionEntry" - }, - "uniqueItems": true - }, - "platforms": { - "description": "Limit which target platforms this capability applies to.\n\nBy default all platforms are targeted.\n\n## Example\n\n`[\"macOS\",\"windows\"]`", - "type": [ - "array", - "null" - ], - "items": { - "$ref": "#/definitions/Target" - } - } - } - }, - "CapabilityRemote": { - "description": "Configuration for remote URLs that are associated with the capability.", - "type": "object", - "required": [ - "urls" - ], - "properties": { - "urls": { - "description": "Remote domains this capability refers to using the [URLPattern standard](https://urlpattern.spec.whatwg.org/).\n\n## Examples\n\n- \"https://*.mydomain.dev\": allows subdomains of mydomain.dev - \"https://mydomain.dev/api/*\": allows any subpath of mydomain.dev/api", - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "PermissionEntry": { - "description": "An entry for a permission value in a [`Capability`] can be either a raw permission [`Identifier`] or an object that references a permission and extends its scope.", - "anyOf": [ - { - "description": "Reference a permission or permission set by identifier.", - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ] - }, - { - "description": "Reference a permission or permission set by identifier and extends its scope.", - "type": "object", - "allOf": [ - { - "if": { - "properties": { - "identifier": { - "anyOf": [ - { - "description": "This permission set configures what kind of\nfetch operations are available from the http plugin.\n\nThis enables all fetch operations but does not\nallow explicitly any origins to be fetched. This needs to\nbe manually configured before usage.\n\n#### Granted Permissions\n\nAll fetch operations are enabled.\n\n\n#### This default permission set includes:\n\n- `allow-fetch`\n- `allow-fetch-cancel`\n- `allow-fetch-read-body`\n- `allow-fetch-send`", - "type": "string", - "const": "http:default", - "markdownDescription": "This permission set configures what kind of\nfetch operations are available from the http plugin.\n\nThis enables all fetch operations but does not\nallow explicitly any origins to be fetched. This needs to\nbe manually configured before usage.\n\n#### Granted Permissions\n\nAll fetch operations are enabled.\n\n\n#### This default permission set includes:\n\n- `allow-fetch`\n- `allow-fetch-cancel`\n- `allow-fetch-read-body`\n- `allow-fetch-send`" - }, - { - "description": "Enables the fetch command without any pre-configured scope.", - "type": "string", - "const": "http:allow-fetch", - "markdownDescription": "Enables the fetch command without any pre-configured scope." - }, - { - "description": "Enables the fetch_cancel command without any pre-configured scope.", - "type": "string", - "const": "http:allow-fetch-cancel", - "markdownDescription": "Enables the fetch_cancel command without any pre-configured scope." - }, - { - "description": "Enables the fetch_read_body command without any pre-configured scope.", - "type": "string", - "const": "http:allow-fetch-read-body", - "markdownDescription": "Enables the fetch_read_body command without any pre-configured scope." - }, - { - "description": "Enables the fetch_send command without any pre-configured scope.", - "type": "string", - "const": "http:allow-fetch-send", - "markdownDescription": "Enables the fetch_send command without any pre-configured scope." - }, - { - "description": "Denies the fetch command without any pre-configured scope.", - "type": "string", - "const": "http:deny-fetch", - "markdownDescription": "Denies the fetch command without any pre-configured scope." - }, - { - "description": "Denies the fetch_cancel command without any pre-configured scope.", - "type": "string", - "const": "http:deny-fetch-cancel", - "markdownDescription": "Denies the fetch_cancel command without any pre-configured scope." - }, - { - "description": "Denies the fetch_read_body command without any pre-configured scope.", - "type": "string", - "const": "http:deny-fetch-read-body", - "markdownDescription": "Denies the fetch_read_body command without any pre-configured scope." - }, - { - "description": "Denies the fetch_send command without any pre-configured scope.", - "type": "string", - "const": "http:deny-fetch-send", - "markdownDescription": "Denies the fetch_send command without any pre-configured scope." - } - ] - } - } - }, - "then": { - "properties": { - "allow": { - "items": { - "title": "HttpScopeEntry", - "description": "HTTP scope entry.", - "anyOf": [ - { - "description": "A URL that can be accessed by the webview when using the HTTP APIs. Wildcards can be used following the URL pattern standard.\n\nSee [the URL Pattern spec](https://urlpattern.spec.whatwg.org/) for more information.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin on port 443\n\n- \"https://*:*\" : allows all HTTPS origin on any port\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"", - "type": "string" - }, - { - "type": "object", - "required": [ - "url" - ], - "properties": { - "url": { - "description": "A URL that can be accessed by the webview when using the HTTP APIs. Wildcards can be used following the URL pattern standard.\n\nSee [the URL Pattern spec](https://urlpattern.spec.whatwg.org/) for more information.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin on port 443\n\n- \"https://*:*\" : allows all HTTPS origin on any port\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"", - "type": "string" - } - } - } - ] - } - }, - "deny": { - "items": { - "title": "HttpScopeEntry", - "description": "HTTP scope entry.", - "anyOf": [ - { - "description": "A URL that can be accessed by the webview when using the HTTP APIs. Wildcards can be used following the URL pattern standard.\n\nSee [the URL Pattern spec](https://urlpattern.spec.whatwg.org/) for more information.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin on port 443\n\n- \"https://*:*\" : allows all HTTPS origin on any port\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"", - "type": "string" - }, - { - "type": "object", - "required": [ - "url" - ], - "properties": { - "url": { - "description": "A URL that can be accessed by the webview when using the HTTP APIs. Wildcards can be used following the URL pattern standard.\n\nSee [the URL Pattern spec](https://urlpattern.spec.whatwg.org/) for more information.\n\nExamples:\n\n- \"https://*\" : allows all HTTPS origin on port 443\n\n- \"https://*:*\" : allows all HTTPS origin on any port\n\n- \"https://*.github.com/tauri-apps/tauri\": allows any subdomain of \"github.com\" with the \"tauri-apps/api\" path\n\n- \"https://myapi.service.com/users/*\": allows access to any URLs that begins with \"https://myapi.service.com/users/\"", - "type": "string" - } - } - } - ] - } - } - } - }, - "properties": { - "identifier": { - "description": "Identifier of the permission or permission set.", - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ] - } - } - }, - { - "if": { - "properties": { - "identifier": { - "anyOf": [ - { - "description": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`", - "type": "string", - "const": "shell:default", - "markdownDescription": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`" - }, - { - "description": "Enables the execute command without any pre-configured scope.", - "type": "string", - "const": "shell:allow-execute", - "markdownDescription": "Enables the execute command without any pre-configured scope." - }, - { - "description": "Enables the kill command without any pre-configured scope.", - "type": "string", - "const": "shell:allow-kill", - "markdownDescription": "Enables the kill command without any pre-configured scope." - }, - { - "description": "Enables the open command without any pre-configured scope.", - "type": "string", - "const": "shell:allow-open", - "markdownDescription": "Enables the open command without any pre-configured scope." - }, - { - "description": "Enables the spawn command without any pre-configured scope.", - "type": "string", - "const": "shell:allow-spawn", - "markdownDescription": "Enables the spawn command without any pre-configured scope." - }, - { - "description": "Enables the stdin_write command without any pre-configured scope.", - "type": "string", - "const": "shell:allow-stdin-write", - "markdownDescription": "Enables the stdin_write command without any pre-configured scope." - }, - { - "description": "Denies the execute command without any pre-configured scope.", - "type": "string", - "const": "shell:deny-execute", - "markdownDescription": "Denies the execute command without any pre-configured scope." - }, - { - "description": "Denies the kill command without any pre-configured scope.", - "type": "string", - "const": "shell:deny-kill", - "markdownDescription": "Denies the kill command without any pre-configured scope." - }, - { - "description": "Denies the open command without any pre-configured scope.", - "type": "string", - "const": "shell:deny-open", - "markdownDescription": "Denies the open command without any pre-configured scope." - }, - { - "description": "Denies the spawn command without any pre-configured scope.", - "type": "string", - "const": "shell:deny-spawn", - "markdownDescription": "Denies the spawn command without any pre-configured scope." - }, - { - "description": "Denies the stdin_write command without any pre-configured scope.", - "type": "string", - "const": "shell:deny-stdin-write", - "markdownDescription": "Denies the stdin_write command without any pre-configured scope." - } - ] - } - } - }, - "then": { - "properties": { - "allow": { - "items": { - "title": "ShellScopeEntry", - "description": "Shell scope entry.", - "anyOf": [ - { - "type": "object", - "required": [ - "cmd", - "name" - ], - "properties": { - "args": { - "description": "The allowed arguments for the command execution.", - "allOf": [ - { - "$ref": "#/definitions/ShellScopeEntryAllowedArgs" - } - ] - }, - "cmd": { - "description": "The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", - "type": "string" - }, - "name": { - "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", - "type": "string" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "name", - "sidecar" - ], - "properties": { - "args": { - "description": "The allowed arguments for the command execution.", - "allOf": [ - { - "$ref": "#/definitions/ShellScopeEntryAllowedArgs" - } - ] - }, - "name": { - "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", - "type": "string" - }, - "sidecar": { - "description": "If this command is a sidecar command.", - "type": "boolean" - } - }, - "additionalProperties": false - } - ] - } - }, - "deny": { - "items": { - "title": "ShellScopeEntry", - "description": "Shell scope entry.", - "anyOf": [ - { - "type": "object", - "required": [ - "cmd", - "name" - ], - "properties": { - "args": { - "description": "The allowed arguments for the command execution.", - "allOf": [ - { - "$ref": "#/definitions/ShellScopeEntryAllowedArgs" - } - ] - }, - "cmd": { - "description": "The command name. It can start with a variable that resolves to a system base directory. The variables are: `$AUDIO`, `$CACHE`, `$CONFIG`, `$DATA`, `$LOCALDATA`, `$DESKTOP`, `$DOCUMENT`, `$DOWNLOAD`, `$EXE`, `$FONT`, `$HOME`, `$PICTURE`, `$PUBLIC`, `$RUNTIME`, `$TEMPLATE`, `$VIDEO`, `$RESOURCE`, `$LOG`, `$TEMP`, `$APPCONFIG`, `$APPDATA`, `$APPLOCALDATA`, `$APPCACHE`, `$APPLOG`.", - "type": "string" - }, - "name": { - "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", - "type": "string" - } - }, - "additionalProperties": false - }, - { - "type": "object", - "required": [ - "name", - "sidecar" - ], - "properties": { - "args": { - "description": "The allowed arguments for the command execution.", - "allOf": [ - { - "$ref": "#/definitions/ShellScopeEntryAllowedArgs" - } - ] - }, - "name": { - "description": "The name for this allowed shell command configuration.\n\nThis name will be used inside of the webview API to call this command along with any specified arguments.", - "type": "string" - }, - "sidecar": { - "description": "If this command is a sidecar command.", - "type": "boolean" - } - }, - "additionalProperties": false - } - ] - } - } - } - }, - "properties": { - "identifier": { - "description": "Identifier of the permission or permission set.", - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ] - } - } - }, - { - "properties": { - "identifier": { - "description": "Identifier of the permission or permission set.", - "allOf": [ - { - "$ref": "#/definitions/Identifier" - } - ] - }, - "allow": { - "description": "Data that defines what is allowed by the scope.", - "type": [ - "array", - "null" - ], - "items": { - "$ref": "#/definitions/Value" - } - }, - "deny": { - "description": "Data that defines what is denied by the scope. This should be prioritized by validation logic.", - "type": [ - "array", - "null" - ], - "items": { - "$ref": "#/definitions/Value" - } - } - } - } - ], - "required": [ - "identifier" - ] - } - ] - }, - "Identifier": { - "description": "Permission identifier", - "oneOf": [ - { - "description": "Default core plugins set.\n#### This default permission set includes:\n\n- `core:path:default`\n- `core:event:default`\n- `core:window:default`\n- `core:webview:default`\n- `core:app:default`\n- `core:image:default`\n- `core:resources:default`\n- `core:menu:default`\n- `core:tray:default`", - "type": "string", - "const": "core:default", - "markdownDescription": "Default core plugins set.\n#### This default permission set includes:\n\n- `core:path:default`\n- `core:event:default`\n- `core:window:default`\n- `core:webview:default`\n- `core:app:default`\n- `core:image:default`\n- `core:resources:default`\n- `core:menu:default`\n- `core:tray:default`" - }, - { - "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-version`\n- `allow-name`\n- `allow-tauri-version`\n- `allow-identifier`", - "type": "string", - "const": "core:app:default", - "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-version`\n- `allow-name`\n- `allow-tauri-version`\n- `allow-identifier`" - }, - { - "description": "Enables the app_hide command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-app-hide", - "markdownDescription": "Enables the app_hide command without any pre-configured scope." - }, - { - "description": "Enables the app_show command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-app-show", - "markdownDescription": "Enables the app_show command without any pre-configured scope." - }, - { - "description": "Enables the default_window_icon command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-default-window-icon", - "markdownDescription": "Enables the default_window_icon command without any pre-configured scope." - }, - { - "description": "Enables the fetch_data_store_identifiers command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-fetch-data-store-identifiers", - "markdownDescription": "Enables the fetch_data_store_identifiers command without any pre-configured scope." - }, - { - "description": "Enables the identifier command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-identifier", - "markdownDescription": "Enables the identifier command without any pre-configured scope." - }, - { - "description": "Enables the name command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-name", - "markdownDescription": "Enables the name command without any pre-configured scope." - }, - { - "description": "Enables the remove_data_store command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-remove-data-store", - "markdownDescription": "Enables the remove_data_store command without any pre-configured scope." - }, - { - "description": "Enables the set_app_theme command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-set-app-theme", - "markdownDescription": "Enables the set_app_theme command without any pre-configured scope." - }, - { - "description": "Enables the tauri_version command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-tauri-version", - "markdownDescription": "Enables the tauri_version command without any pre-configured scope." - }, - { - "description": "Enables the version command without any pre-configured scope.", - "type": "string", - "const": "core:app:allow-version", - "markdownDescription": "Enables the version command without any pre-configured scope." - }, - { - "description": "Denies the app_hide command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-app-hide", - "markdownDescription": "Denies the app_hide command without any pre-configured scope." - }, - { - "description": "Denies the app_show command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-app-show", - "markdownDescription": "Denies the app_show command without any pre-configured scope." - }, - { - "description": "Denies the default_window_icon command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-default-window-icon", - "markdownDescription": "Denies the default_window_icon command without any pre-configured scope." - }, - { - "description": "Denies the fetch_data_store_identifiers command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-fetch-data-store-identifiers", - "markdownDescription": "Denies the fetch_data_store_identifiers command without any pre-configured scope." - }, - { - "description": "Denies the identifier command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-identifier", - "markdownDescription": "Denies the identifier command without any pre-configured scope." - }, - { - "description": "Denies the name command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-name", - "markdownDescription": "Denies the name command without any pre-configured scope." - }, - { - "description": "Denies the remove_data_store command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-remove-data-store", - "markdownDescription": "Denies the remove_data_store command without any pre-configured scope." - }, - { - "description": "Denies the set_app_theme command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-set-app-theme", - "markdownDescription": "Denies the set_app_theme command without any pre-configured scope." - }, - { - "description": "Denies the tauri_version command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-tauri-version", - "markdownDescription": "Denies the tauri_version command without any pre-configured scope." - }, - { - "description": "Denies the version command without any pre-configured scope.", - "type": "string", - "const": "core:app:deny-version", - "markdownDescription": "Denies the version command without any pre-configured scope." - }, - { - "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-listen`\n- `allow-unlisten`\n- `allow-emit`\n- `allow-emit-to`", - "type": "string", - "const": "core:event:default", - "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-listen`\n- `allow-unlisten`\n- `allow-emit`\n- `allow-emit-to`" - }, - { - "description": "Enables the emit command without any pre-configured scope.", - "type": "string", - "const": "core:event:allow-emit", - "markdownDescription": "Enables the emit command without any pre-configured scope." - }, - { - "description": "Enables the emit_to command without any pre-configured scope.", - "type": "string", - "const": "core:event:allow-emit-to", - "markdownDescription": "Enables the emit_to command without any pre-configured scope." - }, - { - "description": "Enables the listen command without any pre-configured scope.", - "type": "string", - "const": "core:event:allow-listen", - "markdownDescription": "Enables the listen command without any pre-configured scope." - }, - { - "description": "Enables the unlisten command without any pre-configured scope.", - "type": "string", - "const": "core:event:allow-unlisten", - "markdownDescription": "Enables the unlisten command without any pre-configured scope." - }, - { - "description": "Denies the emit command without any pre-configured scope.", - "type": "string", - "const": "core:event:deny-emit", - "markdownDescription": "Denies the emit command without any pre-configured scope." - }, - { - "description": "Denies the emit_to command without any pre-configured scope.", - "type": "string", - "const": "core:event:deny-emit-to", - "markdownDescription": "Denies the emit_to command without any pre-configured scope." - }, - { - "description": "Denies the listen command without any pre-configured scope.", - "type": "string", - "const": "core:event:deny-listen", - "markdownDescription": "Denies the listen command without any pre-configured scope." - }, - { - "description": "Denies the unlisten command without any pre-configured scope.", - "type": "string", - "const": "core:event:deny-unlisten", - "markdownDescription": "Denies the unlisten command without any pre-configured scope." - }, - { - "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-from-bytes`\n- `allow-from-path`\n- `allow-rgba`\n- `allow-size`", - "type": "string", - "const": "core:image:default", - "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-from-bytes`\n- `allow-from-path`\n- `allow-rgba`\n- `allow-size`" - }, - { - "description": "Enables the from_bytes command without any pre-configured scope.", - "type": "string", - "const": "core:image:allow-from-bytes", - "markdownDescription": "Enables the from_bytes command without any pre-configured scope." - }, - { - "description": "Enables the from_path command without any pre-configured scope.", - "type": "string", - "const": "core:image:allow-from-path", - "markdownDescription": "Enables the from_path command without any pre-configured scope." - }, - { - "description": "Enables the new command without any pre-configured scope.", - "type": "string", - "const": "core:image:allow-new", - "markdownDescription": "Enables the new command without any pre-configured scope." - }, - { - "description": "Enables the rgba command without any pre-configured scope.", - "type": "string", - "const": "core:image:allow-rgba", - "markdownDescription": "Enables the rgba command without any pre-configured scope." - }, - { - "description": "Enables the size command without any pre-configured scope.", - "type": "string", - "const": "core:image:allow-size", - "markdownDescription": "Enables the size command without any pre-configured scope." - }, - { - "description": "Denies the from_bytes command without any pre-configured scope.", - "type": "string", - "const": "core:image:deny-from-bytes", - "markdownDescription": "Denies the from_bytes command without any pre-configured scope." - }, - { - "description": "Denies the from_path command without any pre-configured scope.", - "type": "string", - "const": "core:image:deny-from-path", - "markdownDescription": "Denies the from_path command without any pre-configured scope." - }, - { - "description": "Denies the new command without any pre-configured scope.", - "type": "string", - "const": "core:image:deny-new", - "markdownDescription": "Denies the new command without any pre-configured scope." - }, - { - "description": "Denies the rgba command without any pre-configured scope.", - "type": "string", - "const": "core:image:deny-rgba", - "markdownDescription": "Denies the rgba command without any pre-configured scope." - }, - { - "description": "Denies the size command without any pre-configured scope.", - "type": "string", - "const": "core:image:deny-size", - "markdownDescription": "Denies the size command without any pre-configured scope." - }, - { - "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-append`\n- `allow-prepend`\n- `allow-insert`\n- `allow-remove`\n- `allow-remove-at`\n- `allow-items`\n- `allow-get`\n- `allow-popup`\n- `allow-create-default`\n- `allow-set-as-app-menu`\n- `allow-set-as-window-menu`\n- `allow-text`\n- `allow-set-text`\n- `allow-is-enabled`\n- `allow-set-enabled`\n- `allow-set-accelerator`\n- `allow-set-as-windows-menu-for-nsapp`\n- `allow-set-as-help-menu-for-nsapp`\n- `allow-is-checked`\n- `allow-set-checked`\n- `allow-set-icon`", - "type": "string", - "const": "core:menu:default", - "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-append`\n- `allow-prepend`\n- `allow-insert`\n- `allow-remove`\n- `allow-remove-at`\n- `allow-items`\n- `allow-get`\n- `allow-popup`\n- `allow-create-default`\n- `allow-set-as-app-menu`\n- `allow-set-as-window-menu`\n- `allow-text`\n- `allow-set-text`\n- `allow-is-enabled`\n- `allow-set-enabled`\n- `allow-set-accelerator`\n- `allow-set-as-windows-menu-for-nsapp`\n- `allow-set-as-help-menu-for-nsapp`\n- `allow-is-checked`\n- `allow-set-checked`\n- `allow-set-icon`" - }, - { - "description": "Enables the append command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-append", - "markdownDescription": "Enables the append command without any pre-configured scope." - }, - { - "description": "Enables the create_default command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-create-default", - "markdownDescription": "Enables the create_default command without any pre-configured scope." - }, - { - "description": "Enables the get command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-get", - "markdownDescription": "Enables the get command without any pre-configured scope." - }, - { - "description": "Enables the insert command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-insert", - "markdownDescription": "Enables the insert command without any pre-configured scope." - }, - { - "description": "Enables the is_checked command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-is-checked", - "markdownDescription": "Enables the is_checked command without any pre-configured scope." - }, - { - "description": "Enables the is_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-is-enabled", - "markdownDescription": "Enables the is_enabled command without any pre-configured scope." - }, - { - "description": "Enables the items command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-items", - "markdownDescription": "Enables the items command without any pre-configured scope." - }, - { - "description": "Enables the new command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-new", - "markdownDescription": "Enables the new command without any pre-configured scope." - }, - { - "description": "Enables the popup command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-popup", - "markdownDescription": "Enables the popup command without any pre-configured scope." - }, - { - "description": "Enables the prepend command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-prepend", - "markdownDescription": "Enables the prepend command without any pre-configured scope." - }, - { - "description": "Enables the remove command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-remove", - "markdownDescription": "Enables the remove command without any pre-configured scope." - }, - { - "description": "Enables the remove_at command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-remove-at", - "markdownDescription": "Enables the remove_at command without any pre-configured scope." - }, - { - "description": "Enables the set_accelerator command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-accelerator", - "markdownDescription": "Enables the set_accelerator command without any pre-configured scope." - }, - { - "description": "Enables the set_as_app_menu command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-as-app-menu", - "markdownDescription": "Enables the set_as_app_menu command without any pre-configured scope." - }, - { - "description": "Enables the set_as_help_menu_for_nsapp command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-as-help-menu-for-nsapp", - "markdownDescription": "Enables the set_as_help_menu_for_nsapp command without any pre-configured scope." - }, - { - "description": "Enables the set_as_window_menu command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-as-window-menu", - "markdownDescription": "Enables the set_as_window_menu command without any pre-configured scope." - }, - { - "description": "Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-as-windows-menu-for-nsapp", - "markdownDescription": "Enables the set_as_windows_menu_for_nsapp command without any pre-configured scope." - }, - { - "description": "Enables the set_checked command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-checked", - "markdownDescription": "Enables the set_checked command without any pre-configured scope." - }, - { - "description": "Enables the set_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-enabled", - "markdownDescription": "Enables the set_enabled command without any pre-configured scope." - }, - { - "description": "Enables the set_icon command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-icon", - "markdownDescription": "Enables the set_icon command without any pre-configured scope." - }, - { - "description": "Enables the set_text command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-set-text", - "markdownDescription": "Enables the set_text command without any pre-configured scope." - }, - { - "description": "Enables the text command without any pre-configured scope.", - "type": "string", - "const": "core:menu:allow-text", - "markdownDescription": "Enables the text command without any pre-configured scope." - }, - { - "description": "Denies the append command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-append", - "markdownDescription": "Denies the append command without any pre-configured scope." - }, - { - "description": "Denies the create_default command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-create-default", - "markdownDescription": "Denies the create_default command without any pre-configured scope." - }, - { - "description": "Denies the get command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-get", - "markdownDescription": "Denies the get command without any pre-configured scope." - }, - { - "description": "Denies the insert command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-insert", - "markdownDescription": "Denies the insert command without any pre-configured scope." - }, - { - "description": "Denies the is_checked command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-is-checked", - "markdownDescription": "Denies the is_checked command without any pre-configured scope." - }, - { - "description": "Denies the is_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-is-enabled", - "markdownDescription": "Denies the is_enabled command without any pre-configured scope." - }, - { - "description": "Denies the items command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-items", - "markdownDescription": "Denies the items command without any pre-configured scope." - }, - { - "description": "Denies the new command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-new", - "markdownDescription": "Denies the new command without any pre-configured scope." - }, - { - "description": "Denies the popup command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-popup", - "markdownDescription": "Denies the popup command without any pre-configured scope." - }, - { - "description": "Denies the prepend command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-prepend", - "markdownDescription": "Denies the prepend command without any pre-configured scope." - }, - { - "description": "Denies the remove command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-remove", - "markdownDescription": "Denies the remove command without any pre-configured scope." - }, - { - "description": "Denies the remove_at command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-remove-at", - "markdownDescription": "Denies the remove_at command without any pre-configured scope." - }, - { - "description": "Denies the set_accelerator command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-accelerator", - "markdownDescription": "Denies the set_accelerator command without any pre-configured scope." - }, - { - "description": "Denies the set_as_app_menu command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-as-app-menu", - "markdownDescription": "Denies the set_as_app_menu command without any pre-configured scope." - }, - { - "description": "Denies the set_as_help_menu_for_nsapp command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-as-help-menu-for-nsapp", - "markdownDescription": "Denies the set_as_help_menu_for_nsapp command without any pre-configured scope." - }, - { - "description": "Denies the set_as_window_menu command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-as-window-menu", - "markdownDescription": "Denies the set_as_window_menu command without any pre-configured scope." - }, - { - "description": "Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-as-windows-menu-for-nsapp", - "markdownDescription": "Denies the set_as_windows_menu_for_nsapp command without any pre-configured scope." - }, - { - "description": "Denies the set_checked command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-checked", - "markdownDescription": "Denies the set_checked command without any pre-configured scope." - }, - { - "description": "Denies the set_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-enabled", - "markdownDescription": "Denies the set_enabled command without any pre-configured scope." - }, - { - "description": "Denies the set_icon command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-icon", - "markdownDescription": "Denies the set_icon command without any pre-configured scope." - }, - { - "description": "Denies the set_text command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-set-text", - "markdownDescription": "Denies the set_text command without any pre-configured scope." - }, - { - "description": "Denies the text command without any pre-configured scope.", - "type": "string", - "const": "core:menu:deny-text", - "markdownDescription": "Denies the text command without any pre-configured scope." - }, - { - "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-resolve-directory`\n- `allow-resolve`\n- `allow-normalize`\n- `allow-join`\n- `allow-dirname`\n- `allow-extname`\n- `allow-basename`\n- `allow-is-absolute`", - "type": "string", - "const": "core:path:default", - "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-resolve-directory`\n- `allow-resolve`\n- `allow-normalize`\n- `allow-join`\n- `allow-dirname`\n- `allow-extname`\n- `allow-basename`\n- `allow-is-absolute`" - }, - { - "description": "Enables the basename command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-basename", - "markdownDescription": "Enables the basename command without any pre-configured scope." - }, - { - "description": "Enables the dirname command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-dirname", - "markdownDescription": "Enables the dirname command without any pre-configured scope." - }, - { - "description": "Enables the extname command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-extname", - "markdownDescription": "Enables the extname command without any pre-configured scope." - }, - { - "description": "Enables the is_absolute command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-is-absolute", - "markdownDescription": "Enables the is_absolute command without any pre-configured scope." - }, - { - "description": "Enables the join command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-join", - "markdownDescription": "Enables the join command without any pre-configured scope." - }, - { - "description": "Enables the normalize command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-normalize", - "markdownDescription": "Enables the normalize command without any pre-configured scope." - }, - { - "description": "Enables the resolve command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-resolve", - "markdownDescription": "Enables the resolve command without any pre-configured scope." - }, - { - "description": "Enables the resolve_directory command without any pre-configured scope.", - "type": "string", - "const": "core:path:allow-resolve-directory", - "markdownDescription": "Enables the resolve_directory command without any pre-configured scope." - }, - { - "description": "Denies the basename command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-basename", - "markdownDescription": "Denies the basename command without any pre-configured scope." - }, - { - "description": "Denies the dirname command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-dirname", - "markdownDescription": "Denies the dirname command without any pre-configured scope." - }, - { - "description": "Denies the extname command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-extname", - "markdownDescription": "Denies the extname command without any pre-configured scope." - }, - { - "description": "Denies the is_absolute command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-is-absolute", - "markdownDescription": "Denies the is_absolute command without any pre-configured scope." - }, - { - "description": "Denies the join command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-join", - "markdownDescription": "Denies the join command without any pre-configured scope." - }, - { - "description": "Denies the normalize command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-normalize", - "markdownDescription": "Denies the normalize command without any pre-configured scope." - }, - { - "description": "Denies the resolve command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-resolve", - "markdownDescription": "Denies the resolve command without any pre-configured scope." - }, - { - "description": "Denies the resolve_directory command without any pre-configured scope.", - "type": "string", - "const": "core:path:deny-resolve-directory", - "markdownDescription": "Denies the resolve_directory command without any pre-configured scope." - }, - { - "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-close`", - "type": "string", - "const": "core:resources:default", - "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-close`" - }, - { - "description": "Enables the close command without any pre-configured scope.", - "type": "string", - "const": "core:resources:allow-close", - "markdownDescription": "Enables the close command without any pre-configured scope." - }, - { - "description": "Denies the close command without any pre-configured scope.", - "type": "string", - "const": "core:resources:deny-close", - "markdownDescription": "Denies the close command without any pre-configured scope." - }, - { - "description": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-get-by-id`\n- `allow-remove-by-id`\n- `allow-set-icon`\n- `allow-set-menu`\n- `allow-set-tooltip`\n- `allow-set-title`\n- `allow-set-visible`\n- `allow-set-temp-dir-path`\n- `allow-set-icon-as-template`\n- `allow-set-show-menu-on-left-click`", - "type": "string", - "const": "core:tray:default", - "markdownDescription": "Default permissions for the plugin, which enables all commands.\n#### This default permission set includes:\n\n- `allow-new`\n- `allow-get-by-id`\n- `allow-remove-by-id`\n- `allow-set-icon`\n- `allow-set-menu`\n- `allow-set-tooltip`\n- `allow-set-title`\n- `allow-set-visible`\n- `allow-set-temp-dir-path`\n- `allow-set-icon-as-template`\n- `allow-set-show-menu-on-left-click`" - }, - { - "description": "Enables the get_by_id command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-get-by-id", - "markdownDescription": "Enables the get_by_id command without any pre-configured scope." - }, - { - "description": "Enables the new command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-new", - "markdownDescription": "Enables the new command without any pre-configured scope." - }, - { - "description": "Enables the remove_by_id command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-remove-by-id", - "markdownDescription": "Enables the remove_by_id command without any pre-configured scope." - }, - { - "description": "Enables the set_icon command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-icon", - "markdownDescription": "Enables the set_icon command without any pre-configured scope." - }, - { - "description": "Enables the set_icon_as_template command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-icon-as-template", - "markdownDescription": "Enables the set_icon_as_template command without any pre-configured scope." - }, - { - "description": "Enables the set_menu command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-menu", - "markdownDescription": "Enables the set_menu command without any pre-configured scope." - }, - { - "description": "Enables the set_show_menu_on_left_click command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-show-menu-on-left-click", - "markdownDescription": "Enables the set_show_menu_on_left_click command without any pre-configured scope." - }, - { - "description": "Enables the set_temp_dir_path command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-temp-dir-path", - "markdownDescription": "Enables the set_temp_dir_path command without any pre-configured scope." - }, - { - "description": "Enables the set_title command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-title", - "markdownDescription": "Enables the set_title command without any pre-configured scope." - }, - { - "description": "Enables the set_tooltip command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-tooltip", - "markdownDescription": "Enables the set_tooltip command without any pre-configured scope." - }, - { - "description": "Enables the set_visible command without any pre-configured scope.", - "type": "string", - "const": "core:tray:allow-set-visible", - "markdownDescription": "Enables the set_visible command without any pre-configured scope." - }, - { - "description": "Denies the get_by_id command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-get-by-id", - "markdownDescription": "Denies the get_by_id command without any pre-configured scope." - }, - { - "description": "Denies the new command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-new", - "markdownDescription": "Denies the new command without any pre-configured scope." - }, - { - "description": "Denies the remove_by_id command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-remove-by-id", - "markdownDescription": "Denies the remove_by_id command without any pre-configured scope." - }, - { - "description": "Denies the set_icon command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-icon", - "markdownDescription": "Denies the set_icon command without any pre-configured scope." - }, - { - "description": "Denies the set_icon_as_template command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-icon-as-template", - "markdownDescription": "Denies the set_icon_as_template command without any pre-configured scope." - }, - { - "description": "Denies the set_menu command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-menu", - "markdownDescription": "Denies the set_menu command without any pre-configured scope." - }, - { - "description": "Denies the set_show_menu_on_left_click command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-show-menu-on-left-click", - "markdownDescription": "Denies the set_show_menu_on_left_click command without any pre-configured scope." - }, - { - "description": "Denies the set_temp_dir_path command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-temp-dir-path", - "markdownDescription": "Denies the set_temp_dir_path command without any pre-configured scope." - }, - { - "description": "Denies the set_title command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-title", - "markdownDescription": "Denies the set_title command without any pre-configured scope." - }, - { - "description": "Denies the set_tooltip command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-tooltip", - "markdownDescription": "Denies the set_tooltip command without any pre-configured scope." - }, - { - "description": "Denies the set_visible command without any pre-configured scope.", - "type": "string", - "const": "core:tray:deny-set-visible", - "markdownDescription": "Denies the set_visible command without any pre-configured scope." - }, - { - "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-webviews`\n- `allow-webview-position`\n- `allow-webview-size`\n- `allow-internal-toggle-devtools`", - "type": "string", - "const": "core:webview:default", - "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-webviews`\n- `allow-webview-position`\n- `allow-webview-size`\n- `allow-internal-toggle-devtools`" - }, - { - "description": "Enables the clear_all_browsing_data command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-clear-all-browsing-data", - "markdownDescription": "Enables the clear_all_browsing_data command without any pre-configured scope." - }, - { - "description": "Enables the create_webview command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-create-webview", - "markdownDescription": "Enables the create_webview command without any pre-configured scope." - }, - { - "description": "Enables the create_webview_window command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-create-webview-window", - "markdownDescription": "Enables the create_webview_window command without any pre-configured scope." - }, - { - "description": "Enables the get_all_webviews command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-get-all-webviews", - "markdownDescription": "Enables the get_all_webviews command without any pre-configured scope." - }, - { - "description": "Enables the internal_toggle_devtools command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-internal-toggle-devtools", - "markdownDescription": "Enables the internal_toggle_devtools command without any pre-configured scope." - }, - { - "description": "Enables the print command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-print", - "markdownDescription": "Enables the print command without any pre-configured scope." - }, - { - "description": "Enables the reparent command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-reparent", - "markdownDescription": "Enables the reparent command without any pre-configured scope." - }, - { - "description": "Enables the set_webview_background_color command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-set-webview-background-color", - "markdownDescription": "Enables the set_webview_background_color command without any pre-configured scope." - }, - { - "description": "Enables the set_webview_focus command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-set-webview-focus", - "markdownDescription": "Enables the set_webview_focus command without any pre-configured scope." - }, - { - "description": "Enables the set_webview_position command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-set-webview-position", - "markdownDescription": "Enables the set_webview_position command without any pre-configured scope." - }, - { - "description": "Enables the set_webview_size command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-set-webview-size", - "markdownDescription": "Enables the set_webview_size command without any pre-configured scope." - }, - { - "description": "Enables the set_webview_zoom command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-set-webview-zoom", - "markdownDescription": "Enables the set_webview_zoom command without any pre-configured scope." - }, - { - "description": "Enables the webview_close command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-webview-close", - "markdownDescription": "Enables the webview_close command without any pre-configured scope." - }, - { - "description": "Enables the webview_hide command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-webview-hide", - "markdownDescription": "Enables the webview_hide command without any pre-configured scope." - }, - { - "description": "Enables the webview_position command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-webview-position", - "markdownDescription": "Enables the webview_position command without any pre-configured scope." - }, - { - "description": "Enables the webview_show command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-webview-show", - "markdownDescription": "Enables the webview_show command without any pre-configured scope." - }, - { - "description": "Enables the webview_size command without any pre-configured scope.", - "type": "string", - "const": "core:webview:allow-webview-size", - "markdownDescription": "Enables the webview_size command without any pre-configured scope." - }, - { - "description": "Denies the clear_all_browsing_data command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-clear-all-browsing-data", - "markdownDescription": "Denies the clear_all_browsing_data command without any pre-configured scope." - }, - { - "description": "Denies the create_webview command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-create-webview", - "markdownDescription": "Denies the create_webview command without any pre-configured scope." - }, - { - "description": "Denies the create_webview_window command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-create-webview-window", - "markdownDescription": "Denies the create_webview_window command without any pre-configured scope." - }, - { - "description": "Denies the get_all_webviews command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-get-all-webviews", - "markdownDescription": "Denies the get_all_webviews command without any pre-configured scope." - }, - { - "description": "Denies the internal_toggle_devtools command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-internal-toggle-devtools", - "markdownDescription": "Denies the internal_toggle_devtools command without any pre-configured scope." - }, - { - "description": "Denies the print command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-print", - "markdownDescription": "Denies the print command without any pre-configured scope." - }, - { - "description": "Denies the reparent command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-reparent", - "markdownDescription": "Denies the reparent command without any pre-configured scope." - }, - { - "description": "Denies the set_webview_background_color command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-set-webview-background-color", - "markdownDescription": "Denies the set_webview_background_color command without any pre-configured scope." - }, - { - "description": "Denies the set_webview_focus command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-set-webview-focus", - "markdownDescription": "Denies the set_webview_focus command without any pre-configured scope." - }, - { - "description": "Denies the set_webview_position command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-set-webview-position", - "markdownDescription": "Denies the set_webview_position command without any pre-configured scope." - }, - { - "description": "Denies the set_webview_size command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-set-webview-size", - "markdownDescription": "Denies the set_webview_size command without any pre-configured scope." - }, - { - "description": "Denies the set_webview_zoom command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-set-webview-zoom", - "markdownDescription": "Denies the set_webview_zoom command without any pre-configured scope." - }, - { - "description": "Denies the webview_close command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-webview-close", - "markdownDescription": "Denies the webview_close command without any pre-configured scope." - }, - { - "description": "Denies the webview_hide command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-webview-hide", - "markdownDescription": "Denies the webview_hide command without any pre-configured scope." - }, - { - "description": "Denies the webview_position command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-webview-position", - "markdownDescription": "Denies the webview_position command without any pre-configured scope." - }, - { - "description": "Denies the webview_show command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-webview-show", - "markdownDescription": "Denies the webview_show command without any pre-configured scope." - }, - { - "description": "Denies the webview_size command without any pre-configured scope.", - "type": "string", - "const": "core:webview:deny-webview-size", - "markdownDescription": "Denies the webview_size command without any pre-configured scope." - }, - { - "description": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-windows`\n- `allow-scale-factor`\n- `allow-inner-position`\n- `allow-outer-position`\n- `allow-inner-size`\n- `allow-outer-size`\n- `allow-is-fullscreen`\n- `allow-is-minimized`\n- `allow-is-maximized`\n- `allow-is-focused`\n- `allow-is-decorated`\n- `allow-is-resizable`\n- `allow-is-maximizable`\n- `allow-is-minimizable`\n- `allow-is-closable`\n- `allow-is-visible`\n- `allow-is-enabled`\n- `allow-title`\n- `allow-current-monitor`\n- `allow-primary-monitor`\n- `allow-monitor-from-point`\n- `allow-available-monitors`\n- `allow-cursor-position`\n- `allow-theme`\n- `allow-is-always-on-top`\n- `allow-internal-toggle-maximize`", - "type": "string", - "const": "core:window:default", - "markdownDescription": "Default permissions for the plugin.\n#### This default permission set includes:\n\n- `allow-get-all-windows`\n- `allow-scale-factor`\n- `allow-inner-position`\n- `allow-outer-position`\n- `allow-inner-size`\n- `allow-outer-size`\n- `allow-is-fullscreen`\n- `allow-is-minimized`\n- `allow-is-maximized`\n- `allow-is-focused`\n- `allow-is-decorated`\n- `allow-is-resizable`\n- `allow-is-maximizable`\n- `allow-is-minimizable`\n- `allow-is-closable`\n- `allow-is-visible`\n- `allow-is-enabled`\n- `allow-title`\n- `allow-current-monitor`\n- `allow-primary-monitor`\n- `allow-monitor-from-point`\n- `allow-available-monitors`\n- `allow-cursor-position`\n- `allow-theme`\n- `allow-is-always-on-top`\n- `allow-internal-toggle-maximize`" - }, - { - "description": "Enables the available_monitors command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-available-monitors", - "markdownDescription": "Enables the available_monitors command without any pre-configured scope." - }, - { - "description": "Enables the center command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-center", - "markdownDescription": "Enables the center command without any pre-configured scope." - }, - { - "description": "Enables the close command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-close", - "markdownDescription": "Enables the close command without any pre-configured scope." - }, - { - "description": "Enables the create command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-create", - "markdownDescription": "Enables the create command without any pre-configured scope." - }, - { - "description": "Enables the current_monitor command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-current-monitor", - "markdownDescription": "Enables the current_monitor command without any pre-configured scope." - }, - { - "description": "Enables the cursor_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-cursor-position", - "markdownDescription": "Enables the cursor_position command without any pre-configured scope." - }, - { - "description": "Enables the destroy command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-destroy", - "markdownDescription": "Enables the destroy command without any pre-configured scope." - }, - { - "description": "Enables the get_all_windows command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-get-all-windows", - "markdownDescription": "Enables the get_all_windows command without any pre-configured scope." - }, - { - "description": "Enables the hide command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-hide", - "markdownDescription": "Enables the hide command without any pre-configured scope." - }, - { - "description": "Enables the inner_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-inner-position", - "markdownDescription": "Enables the inner_position command without any pre-configured scope." - }, - { - "description": "Enables the inner_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-inner-size", - "markdownDescription": "Enables the inner_size command without any pre-configured scope." - }, - { - "description": "Enables the internal_toggle_maximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-internal-toggle-maximize", - "markdownDescription": "Enables the internal_toggle_maximize command without any pre-configured scope." - }, - { - "description": "Enables the is_always_on_top command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-always-on-top", - "markdownDescription": "Enables the is_always_on_top command without any pre-configured scope." - }, - { - "description": "Enables the is_closable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-closable", - "markdownDescription": "Enables the is_closable command without any pre-configured scope." - }, - { - "description": "Enables the is_decorated command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-decorated", - "markdownDescription": "Enables the is_decorated command without any pre-configured scope." - }, - { - "description": "Enables the is_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-enabled", - "markdownDescription": "Enables the is_enabled command without any pre-configured scope." - }, - { - "description": "Enables the is_focused command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-focused", - "markdownDescription": "Enables the is_focused command without any pre-configured scope." - }, - { - "description": "Enables the is_fullscreen command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-fullscreen", - "markdownDescription": "Enables the is_fullscreen command without any pre-configured scope." - }, - { - "description": "Enables the is_maximizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-maximizable", - "markdownDescription": "Enables the is_maximizable command without any pre-configured scope." - }, - { - "description": "Enables the is_maximized command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-maximized", - "markdownDescription": "Enables the is_maximized command without any pre-configured scope." - }, - { - "description": "Enables the is_minimizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-minimizable", - "markdownDescription": "Enables the is_minimizable command without any pre-configured scope." - }, - { - "description": "Enables the is_minimized command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-minimized", - "markdownDescription": "Enables the is_minimized command without any pre-configured scope." - }, - { - "description": "Enables the is_resizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-resizable", - "markdownDescription": "Enables the is_resizable command without any pre-configured scope." - }, - { - "description": "Enables the is_visible command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-is-visible", - "markdownDescription": "Enables the is_visible command without any pre-configured scope." - }, - { - "description": "Enables the maximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-maximize", - "markdownDescription": "Enables the maximize command without any pre-configured scope." - }, - { - "description": "Enables the minimize command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-minimize", - "markdownDescription": "Enables the minimize command without any pre-configured scope." - }, - { - "description": "Enables the monitor_from_point command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-monitor-from-point", - "markdownDescription": "Enables the monitor_from_point command without any pre-configured scope." - }, - { - "description": "Enables the outer_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-outer-position", - "markdownDescription": "Enables the outer_position command without any pre-configured scope." - }, - { - "description": "Enables the outer_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-outer-size", - "markdownDescription": "Enables the outer_size command without any pre-configured scope." - }, - { - "description": "Enables the primary_monitor command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-primary-monitor", - "markdownDescription": "Enables the primary_monitor command without any pre-configured scope." - }, - { - "description": "Enables the request_user_attention command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-request-user-attention", - "markdownDescription": "Enables the request_user_attention command without any pre-configured scope." - }, - { - "description": "Enables the scale_factor command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-scale-factor", - "markdownDescription": "Enables the scale_factor command without any pre-configured scope." - }, - { - "description": "Enables the set_always_on_bottom command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-always-on-bottom", - "markdownDescription": "Enables the set_always_on_bottom command without any pre-configured scope." - }, - { - "description": "Enables the set_always_on_top command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-always-on-top", - "markdownDescription": "Enables the set_always_on_top command without any pre-configured scope." - }, - { - "description": "Enables the set_background_color command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-background-color", - "markdownDescription": "Enables the set_background_color command without any pre-configured scope." - }, - { - "description": "Enables the set_badge_count command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-badge-count", - "markdownDescription": "Enables the set_badge_count command without any pre-configured scope." - }, - { - "description": "Enables the set_badge_label command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-badge-label", - "markdownDescription": "Enables the set_badge_label command without any pre-configured scope." - }, - { - "description": "Enables the set_closable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-closable", - "markdownDescription": "Enables the set_closable command without any pre-configured scope." - }, - { - "description": "Enables the set_content_protected command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-content-protected", - "markdownDescription": "Enables the set_content_protected command without any pre-configured scope." - }, - { - "description": "Enables the set_cursor_grab command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-cursor-grab", - "markdownDescription": "Enables the set_cursor_grab command without any pre-configured scope." - }, - { - "description": "Enables the set_cursor_icon command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-cursor-icon", - "markdownDescription": "Enables the set_cursor_icon command without any pre-configured scope." - }, - { - "description": "Enables the set_cursor_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-cursor-position", - "markdownDescription": "Enables the set_cursor_position command without any pre-configured scope." - }, - { - "description": "Enables the set_cursor_visible command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-cursor-visible", - "markdownDescription": "Enables the set_cursor_visible command without any pre-configured scope." - }, - { - "description": "Enables the set_decorations command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-decorations", - "markdownDescription": "Enables the set_decorations command without any pre-configured scope." - }, - { - "description": "Enables the set_effects command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-effects", - "markdownDescription": "Enables the set_effects command without any pre-configured scope." - }, - { - "description": "Enables the set_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-enabled", - "markdownDescription": "Enables the set_enabled command without any pre-configured scope." - }, - { - "description": "Enables the set_focus command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-focus", - "markdownDescription": "Enables the set_focus command without any pre-configured scope." - }, - { - "description": "Enables the set_fullscreen command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-fullscreen", - "markdownDescription": "Enables the set_fullscreen command without any pre-configured scope." - }, - { - "description": "Enables the set_icon command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-icon", - "markdownDescription": "Enables the set_icon command without any pre-configured scope." - }, - { - "description": "Enables the set_ignore_cursor_events command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-ignore-cursor-events", - "markdownDescription": "Enables the set_ignore_cursor_events command without any pre-configured scope." - }, - { - "description": "Enables the set_max_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-max-size", - "markdownDescription": "Enables the set_max_size command without any pre-configured scope." - }, - { - "description": "Enables the set_maximizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-maximizable", - "markdownDescription": "Enables the set_maximizable command without any pre-configured scope." - }, - { - "description": "Enables the set_min_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-min-size", - "markdownDescription": "Enables the set_min_size command without any pre-configured scope." - }, - { - "description": "Enables the set_minimizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-minimizable", - "markdownDescription": "Enables the set_minimizable command without any pre-configured scope." - }, - { - "description": "Enables the set_overlay_icon command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-overlay-icon", - "markdownDescription": "Enables the set_overlay_icon command without any pre-configured scope." - }, - { - "description": "Enables the set_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-position", - "markdownDescription": "Enables the set_position command without any pre-configured scope." - }, - { - "description": "Enables the set_progress_bar command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-progress-bar", - "markdownDescription": "Enables the set_progress_bar command without any pre-configured scope." - }, - { - "description": "Enables the set_resizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-resizable", - "markdownDescription": "Enables the set_resizable command without any pre-configured scope." - }, - { - "description": "Enables the set_shadow command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-shadow", - "markdownDescription": "Enables the set_shadow command without any pre-configured scope." - }, - { - "description": "Enables the set_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-size", - "markdownDescription": "Enables the set_size command without any pre-configured scope." - }, - { - "description": "Enables the set_size_constraints command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-size-constraints", - "markdownDescription": "Enables the set_size_constraints command without any pre-configured scope." - }, - { - "description": "Enables the set_skip_taskbar command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-skip-taskbar", - "markdownDescription": "Enables the set_skip_taskbar command without any pre-configured scope." - }, - { - "description": "Enables the set_theme command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-theme", - "markdownDescription": "Enables the set_theme command without any pre-configured scope." - }, - { - "description": "Enables the set_title command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-title", - "markdownDescription": "Enables the set_title command without any pre-configured scope." - }, - { - "description": "Enables the set_title_bar_style command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-title-bar-style", - "markdownDescription": "Enables the set_title_bar_style command without any pre-configured scope." - }, - { - "description": "Enables the set_visible_on_all_workspaces command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-set-visible-on-all-workspaces", - "markdownDescription": "Enables the set_visible_on_all_workspaces command without any pre-configured scope." - }, - { - "description": "Enables the show command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-show", - "markdownDescription": "Enables the show command without any pre-configured scope." - }, - { - "description": "Enables the start_dragging command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-start-dragging", - "markdownDescription": "Enables the start_dragging command without any pre-configured scope." - }, - { - "description": "Enables the start_resize_dragging command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-start-resize-dragging", - "markdownDescription": "Enables the start_resize_dragging command without any pre-configured scope." - }, - { - "description": "Enables the theme command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-theme", - "markdownDescription": "Enables the theme command without any pre-configured scope." - }, - { - "description": "Enables the title command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-title", - "markdownDescription": "Enables the title command without any pre-configured scope." - }, - { - "description": "Enables the toggle_maximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-toggle-maximize", - "markdownDescription": "Enables the toggle_maximize command without any pre-configured scope." - }, - { - "description": "Enables the unmaximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-unmaximize", - "markdownDescription": "Enables the unmaximize command without any pre-configured scope." - }, - { - "description": "Enables the unminimize command without any pre-configured scope.", - "type": "string", - "const": "core:window:allow-unminimize", - "markdownDescription": "Enables the unminimize command without any pre-configured scope." - }, - { - "description": "Denies the available_monitors command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-available-monitors", - "markdownDescription": "Denies the available_monitors command without any pre-configured scope." - }, - { - "description": "Denies the center command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-center", - "markdownDescription": "Denies the center command without any pre-configured scope." - }, - { - "description": "Denies the close command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-close", - "markdownDescription": "Denies the close command without any pre-configured scope." - }, - { - "description": "Denies the create command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-create", - "markdownDescription": "Denies the create command without any pre-configured scope." - }, - { - "description": "Denies the current_monitor command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-current-monitor", - "markdownDescription": "Denies the current_monitor command without any pre-configured scope." - }, - { - "description": "Denies the cursor_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-cursor-position", - "markdownDescription": "Denies the cursor_position command without any pre-configured scope." - }, - { - "description": "Denies the destroy command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-destroy", - "markdownDescription": "Denies the destroy command without any pre-configured scope." - }, - { - "description": "Denies the get_all_windows command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-get-all-windows", - "markdownDescription": "Denies the get_all_windows command without any pre-configured scope." - }, - { - "description": "Denies the hide command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-hide", - "markdownDescription": "Denies the hide command without any pre-configured scope." - }, - { - "description": "Denies the inner_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-inner-position", - "markdownDescription": "Denies the inner_position command without any pre-configured scope." - }, - { - "description": "Denies the inner_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-inner-size", - "markdownDescription": "Denies the inner_size command without any pre-configured scope." - }, - { - "description": "Denies the internal_toggle_maximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-internal-toggle-maximize", - "markdownDescription": "Denies the internal_toggle_maximize command without any pre-configured scope." - }, - { - "description": "Denies the is_always_on_top command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-always-on-top", - "markdownDescription": "Denies the is_always_on_top command without any pre-configured scope." - }, - { - "description": "Denies the is_closable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-closable", - "markdownDescription": "Denies the is_closable command without any pre-configured scope." - }, - { - "description": "Denies the is_decorated command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-decorated", - "markdownDescription": "Denies the is_decorated command without any pre-configured scope." - }, - { - "description": "Denies the is_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-enabled", - "markdownDescription": "Denies the is_enabled command without any pre-configured scope." - }, - { - "description": "Denies the is_focused command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-focused", - "markdownDescription": "Denies the is_focused command without any pre-configured scope." - }, - { - "description": "Denies the is_fullscreen command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-fullscreen", - "markdownDescription": "Denies the is_fullscreen command without any pre-configured scope." - }, - { - "description": "Denies the is_maximizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-maximizable", - "markdownDescription": "Denies the is_maximizable command without any pre-configured scope." - }, - { - "description": "Denies the is_maximized command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-maximized", - "markdownDescription": "Denies the is_maximized command without any pre-configured scope." - }, - { - "description": "Denies the is_minimizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-minimizable", - "markdownDescription": "Denies the is_minimizable command without any pre-configured scope." - }, - { - "description": "Denies the is_minimized command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-minimized", - "markdownDescription": "Denies the is_minimized command without any pre-configured scope." - }, - { - "description": "Denies the is_resizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-resizable", - "markdownDescription": "Denies the is_resizable command without any pre-configured scope." - }, - { - "description": "Denies the is_visible command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-is-visible", - "markdownDescription": "Denies the is_visible command without any pre-configured scope." - }, - { - "description": "Denies the maximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-maximize", - "markdownDescription": "Denies the maximize command without any pre-configured scope." - }, - { - "description": "Denies the minimize command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-minimize", - "markdownDescription": "Denies the minimize command without any pre-configured scope." - }, - { - "description": "Denies the monitor_from_point command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-monitor-from-point", - "markdownDescription": "Denies the monitor_from_point command without any pre-configured scope." - }, - { - "description": "Denies the outer_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-outer-position", - "markdownDescription": "Denies the outer_position command without any pre-configured scope." - }, - { - "description": "Denies the outer_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-outer-size", - "markdownDescription": "Denies the outer_size command without any pre-configured scope." - }, - { - "description": "Denies the primary_monitor command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-primary-monitor", - "markdownDescription": "Denies the primary_monitor command without any pre-configured scope." - }, - { - "description": "Denies the request_user_attention command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-request-user-attention", - "markdownDescription": "Denies the request_user_attention command without any pre-configured scope." - }, - { - "description": "Denies the scale_factor command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-scale-factor", - "markdownDescription": "Denies the scale_factor command without any pre-configured scope." - }, - { - "description": "Denies the set_always_on_bottom command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-always-on-bottom", - "markdownDescription": "Denies the set_always_on_bottom command without any pre-configured scope." - }, - { - "description": "Denies the set_always_on_top command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-always-on-top", - "markdownDescription": "Denies the set_always_on_top command without any pre-configured scope." - }, - { - "description": "Denies the set_background_color command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-background-color", - "markdownDescription": "Denies the set_background_color command without any pre-configured scope." - }, - { - "description": "Denies the set_badge_count command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-badge-count", - "markdownDescription": "Denies the set_badge_count command without any pre-configured scope." - }, - { - "description": "Denies the set_badge_label command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-badge-label", - "markdownDescription": "Denies the set_badge_label command without any pre-configured scope." - }, - { - "description": "Denies the set_closable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-closable", - "markdownDescription": "Denies the set_closable command without any pre-configured scope." - }, - { - "description": "Denies the set_content_protected command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-content-protected", - "markdownDescription": "Denies the set_content_protected command without any pre-configured scope." - }, - { - "description": "Denies the set_cursor_grab command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-cursor-grab", - "markdownDescription": "Denies the set_cursor_grab command without any pre-configured scope." - }, - { - "description": "Denies the set_cursor_icon command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-cursor-icon", - "markdownDescription": "Denies the set_cursor_icon command without any pre-configured scope." - }, - { - "description": "Denies the set_cursor_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-cursor-position", - "markdownDescription": "Denies the set_cursor_position command without any pre-configured scope." - }, - { - "description": "Denies the set_cursor_visible command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-cursor-visible", - "markdownDescription": "Denies the set_cursor_visible command without any pre-configured scope." - }, - { - "description": "Denies the set_decorations command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-decorations", - "markdownDescription": "Denies the set_decorations command without any pre-configured scope." - }, - { - "description": "Denies the set_effects command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-effects", - "markdownDescription": "Denies the set_effects command without any pre-configured scope." - }, - { - "description": "Denies the set_enabled command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-enabled", - "markdownDescription": "Denies the set_enabled command without any pre-configured scope." - }, - { - "description": "Denies the set_focus command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-focus", - "markdownDescription": "Denies the set_focus command without any pre-configured scope." - }, - { - "description": "Denies the set_fullscreen command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-fullscreen", - "markdownDescription": "Denies the set_fullscreen command without any pre-configured scope." - }, - { - "description": "Denies the set_icon command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-icon", - "markdownDescription": "Denies the set_icon command without any pre-configured scope." - }, - { - "description": "Denies the set_ignore_cursor_events command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-ignore-cursor-events", - "markdownDescription": "Denies the set_ignore_cursor_events command without any pre-configured scope." - }, - { - "description": "Denies the set_max_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-max-size", - "markdownDescription": "Denies the set_max_size command without any pre-configured scope." - }, - { - "description": "Denies the set_maximizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-maximizable", - "markdownDescription": "Denies the set_maximizable command without any pre-configured scope." - }, - { - "description": "Denies the set_min_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-min-size", - "markdownDescription": "Denies the set_min_size command without any pre-configured scope." - }, - { - "description": "Denies the set_minimizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-minimizable", - "markdownDescription": "Denies the set_minimizable command without any pre-configured scope." - }, - { - "description": "Denies the set_overlay_icon command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-overlay-icon", - "markdownDescription": "Denies the set_overlay_icon command without any pre-configured scope." - }, - { - "description": "Denies the set_position command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-position", - "markdownDescription": "Denies the set_position command without any pre-configured scope." - }, - { - "description": "Denies the set_progress_bar command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-progress-bar", - "markdownDescription": "Denies the set_progress_bar command without any pre-configured scope." - }, - { - "description": "Denies the set_resizable command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-resizable", - "markdownDescription": "Denies the set_resizable command without any pre-configured scope." - }, - { - "description": "Denies the set_shadow command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-shadow", - "markdownDescription": "Denies the set_shadow command without any pre-configured scope." - }, - { - "description": "Denies the set_size command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-size", - "markdownDescription": "Denies the set_size command without any pre-configured scope." - }, - { - "description": "Denies the set_size_constraints command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-size-constraints", - "markdownDescription": "Denies the set_size_constraints command without any pre-configured scope." - }, - { - "description": "Denies the set_skip_taskbar command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-skip-taskbar", - "markdownDescription": "Denies the set_skip_taskbar command without any pre-configured scope." - }, - { - "description": "Denies the set_theme command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-theme", - "markdownDescription": "Denies the set_theme command without any pre-configured scope." - }, - { - "description": "Denies the set_title command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-title", - "markdownDescription": "Denies the set_title command without any pre-configured scope." - }, - { - "description": "Denies the set_title_bar_style command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-title-bar-style", - "markdownDescription": "Denies the set_title_bar_style command without any pre-configured scope." - }, - { - "description": "Denies the set_visible_on_all_workspaces command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-set-visible-on-all-workspaces", - "markdownDescription": "Denies the set_visible_on_all_workspaces command without any pre-configured scope." - }, - { - "description": "Denies the show command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-show", - "markdownDescription": "Denies the show command without any pre-configured scope." - }, - { - "description": "Denies the start_dragging command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-start-dragging", - "markdownDescription": "Denies the start_dragging command without any pre-configured scope." - }, - { - "description": "Denies the start_resize_dragging command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-start-resize-dragging", - "markdownDescription": "Denies the start_resize_dragging command without any pre-configured scope." - }, - { - "description": "Denies the theme command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-theme", - "markdownDescription": "Denies the theme command without any pre-configured scope." - }, - { - "description": "Denies the title command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-title", - "markdownDescription": "Denies the title command without any pre-configured scope." - }, - { - "description": "Denies the toggle_maximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-toggle-maximize", - "markdownDescription": "Denies the toggle_maximize command without any pre-configured scope." - }, - { - "description": "Denies the unmaximize command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-unmaximize", - "markdownDescription": "Denies the unmaximize command without any pre-configured scope." - }, - { - "description": "Denies the unminimize command without any pre-configured scope.", - "type": "string", - "const": "core:window:deny-unminimize", - "markdownDescription": "Denies the unminimize command without any pre-configured scope." - }, - { - "description": "This permission set configures what kind of\nfetch operations are available from the http plugin.\n\nThis enables all fetch operations but does not\nallow explicitly any origins to be fetched. This needs to\nbe manually configured before usage.\n\n#### Granted Permissions\n\nAll fetch operations are enabled.\n\n\n#### This default permission set includes:\n\n- `allow-fetch`\n- `allow-fetch-cancel`\n- `allow-fetch-read-body`\n- `allow-fetch-send`", - "type": "string", - "const": "http:default", - "markdownDescription": "This permission set configures what kind of\nfetch operations are available from the http plugin.\n\nThis enables all fetch operations but does not\nallow explicitly any origins to be fetched. This needs to\nbe manually configured before usage.\n\n#### Granted Permissions\n\nAll fetch operations are enabled.\n\n\n#### This default permission set includes:\n\n- `allow-fetch`\n- `allow-fetch-cancel`\n- `allow-fetch-read-body`\n- `allow-fetch-send`" - }, - { - "description": "Enables the fetch command without any pre-configured scope.", - "type": "string", - "const": "http:allow-fetch", - "markdownDescription": "Enables the fetch command without any pre-configured scope." - }, - { - "description": "Enables the fetch_cancel command without any pre-configured scope.", - "type": "string", - "const": "http:allow-fetch-cancel", - "markdownDescription": "Enables the fetch_cancel command without any pre-configured scope." - }, - { - "description": "Enables the fetch_read_body command without any pre-configured scope.", - "type": "string", - "const": "http:allow-fetch-read-body", - "markdownDescription": "Enables the fetch_read_body command without any pre-configured scope." - }, - { - "description": "Enables the fetch_send command without any pre-configured scope.", - "type": "string", - "const": "http:allow-fetch-send", - "markdownDescription": "Enables the fetch_send command without any pre-configured scope." - }, - { - "description": "Denies the fetch command without any pre-configured scope.", - "type": "string", - "const": "http:deny-fetch", - "markdownDescription": "Denies the fetch command without any pre-configured scope." - }, - { - "description": "Denies the fetch_cancel command without any pre-configured scope.", - "type": "string", - "const": "http:deny-fetch-cancel", - "markdownDescription": "Denies the fetch_cancel command without any pre-configured scope." - }, - { - "description": "Denies the fetch_read_body command without any pre-configured scope.", - "type": "string", - "const": "http:deny-fetch-read-body", - "markdownDescription": "Denies the fetch_read_body command without any pre-configured scope." - }, - { - "description": "Denies the fetch_send command without any pre-configured scope.", - "type": "string", - "const": "http:deny-fetch-send", - "markdownDescription": "Denies the fetch_send command without any pre-configured scope." - }, - { - "description": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`", - "type": "string", - "const": "shell:default", - "markdownDescription": "This permission set configures which\nshell functionality is exposed by default.\n\n#### Granted Permissions\n\nIt allows to use the `open` functionality with a reasonable\nscope pre-configured. It will allow opening `http(s)://`,\n`tel:` and `mailto:` links.\n\n#### This default permission set includes:\n\n- `allow-open`" - }, - { - "description": "Enables the execute command without any pre-configured scope.", - "type": "string", - "const": "shell:allow-execute", - "markdownDescription": "Enables the execute command without any pre-configured scope." - }, - { - "description": "Enables the kill command without any pre-configured scope.", - "type": "string", - "const": "shell:allow-kill", - "markdownDescription": "Enables the kill command without any pre-configured scope." - }, - { - "description": "Enables the open command without any pre-configured scope.", - "type": "string", - "const": "shell:allow-open", - "markdownDescription": "Enables the open command without any pre-configured scope." - }, - { - "description": "Enables the spawn command without any pre-configured scope.", - "type": "string", - "const": "shell:allow-spawn", - "markdownDescription": "Enables the spawn command without any pre-configured scope." - }, - { - "description": "Enables the stdin_write command without any pre-configured scope.", - "type": "string", - "const": "shell:allow-stdin-write", - "markdownDescription": "Enables the stdin_write command without any pre-configured scope." - }, - { - "description": "Denies the execute command without any pre-configured scope.", - "type": "string", - "const": "shell:deny-execute", - "markdownDescription": "Denies the execute command without any pre-configured scope." - }, - { - "description": "Denies the kill command without any pre-configured scope.", - "type": "string", - "const": "shell:deny-kill", - "markdownDescription": "Denies the kill command without any pre-configured scope." - }, - { - "description": "Denies the open command without any pre-configured scope.", - "type": "string", - "const": "shell:deny-open", - "markdownDescription": "Denies the open command without any pre-configured scope." - }, - { - "description": "Denies the spawn command without any pre-configured scope.", - "type": "string", - "const": "shell:deny-spawn", - "markdownDescription": "Denies the spawn command without any pre-configured scope." - }, - { - "description": "Denies the stdin_write command without any pre-configured scope.", - "type": "string", - "const": "shell:deny-stdin-write", - "markdownDescription": "Denies the stdin_write command without any pre-configured scope." - } - ] - }, - "Value": { - "description": "All supported ACL values.", - "anyOf": [ - { - "description": "Represents a null JSON value.", - "type": "null" - }, - { - "description": "Represents a [`bool`].", - "type": "boolean" - }, - { - "description": "Represents a valid ACL [`Number`].", - "allOf": [ - { - "$ref": "#/definitions/Number" - } - ] - }, - { - "description": "Represents a [`String`].", - "type": "string" - }, - { - "description": "Represents a list of other [`Value`]s.", - "type": "array", - "items": { - "$ref": "#/definitions/Value" - } - }, - { - "description": "Represents a map of [`String`] keys to [`Value`]s.", - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/Value" - } - } - ] - }, - "Number": { - "description": "A valid ACL number.", - "anyOf": [ - { - "description": "Represents an [`i64`].", - "type": "integer", - "format": "int64" - }, - { - "description": "Represents a [`f64`].", - "type": "number", - "format": "double" - } - ] - }, - "Target": { - "description": "Platform target.", - "oneOf": [ - { - "description": "MacOS.", - "type": "string", - "enum": [ - "macOS" - ] - }, - { - "description": "Windows.", - "type": "string", - "enum": [ - "windows" - ] - }, - { - "description": "Linux.", - "type": "string", - "enum": [ - "linux" - ] - }, - { - "description": "Android.", - "type": "string", - "enum": [ - "android" - ] - }, - { - "description": "iOS.", - "type": "string", - "enum": [ - "iOS" - ] - } - ] - }, - "ShellScopeEntryAllowedArg": { - "description": "A command argument allowed to be executed by the webview API.", - "anyOf": [ - { - "description": "A non-configurable argument that is passed to the command in the order it was specified.", - "type": "string" - }, - { - "description": "A variable that is set while calling the command from the webview API.", - "type": "object", - "required": [ - "validator" - ], - "properties": { - "raw": { - "description": "Marks the validator as a raw regex, meaning the plugin should not make any modification at runtime.\n\nThis means the regex will not match on the entire string by default, which might be exploited if your regex allow unexpected input to be considered valid. When using this option, make sure your regex is correct.", - "default": false, - "type": "boolean" - }, - "validator": { - "description": "[regex] validator to require passed values to conform to an expected input.\n\nThis will require the argument value passed to this variable to match the `validator` regex before it will be executed.\n\nThe regex string is by default surrounded by `^...$` to match the full string. For example the `https?://\\w+` regex would be registered as `^https?://\\w+$`.\n\n[regex]: ", - "type": "string" - } - }, - "additionalProperties": false - } - ] - }, - "ShellScopeEntryAllowedArgs": { - "description": "A set of command arguments allowed to be executed by the webview API.\n\nA value of `true` will allow any arguments to be passed to the command. `false` will disable all arguments. A list of [`ShellScopeEntryAllowedArg`] will set those arguments as the only valid arguments to be passed to the attached command configuration.", - "anyOf": [ - { - "description": "Use a simple boolean to allow all or disable all arguments to this command configuration.", - "type": "boolean" - }, - { - "description": "A specific set of [`ShellScopeEntryAllowedArg`] that are valid to call for the command configuration.", - "type": "array", - "items": { - "$ref": "#/definitions/ShellScopeEntryAllowedArg" - } - } - ] - } - } -} \ No newline at end of file diff --git a/frontend/wasm/Cargo.toml b/frontend/wasm/Cargo.toml index 96bdd5a64f..9182f1ad92 100644 --- a/frontend/wasm/Cargo.toml +++ b/frontend/wasm/Cargo.toml @@ -46,7 +46,7 @@ wasm-opt = false [package.metadata.wasm-pack.profile.dev.wasm-bindgen] debug-js-glue = true demangle-name-section = true -dwarf-debug-info = true +dwarf-debug-info = false [package.metadata.wasm-pack.profile.release] wasm-opt = ["-Os", "-g"] diff --git a/libraries/bezier-rs/src/subpath/core.rs b/libraries/bezier-rs/src/subpath/core.rs index 7636ed76b0..a18550db6d 100644 --- a/libraries/bezier-rs/src/subpath/core.rs +++ b/libraries/bezier-rs/src/subpath/core.rs @@ -104,7 +104,7 @@ impl Subpath { } /// Returns an iterator of the [Bezier]s along the `Subpath`. - pub fn iter(&self) -> SubpathIter { + pub fn iter(&self) -> SubpathIter<'_, PointId> { SubpathIter { subpath: self, index: 0, @@ -113,7 +113,7 @@ impl Subpath { } /// Returns an iterator of the [Bezier]s along the `Subpath` always considering it as a closed subpath. - pub fn iter_closed(&self) -> SubpathIter { + pub fn iter_closed(&self) -> SubpathIter<'_, PointId> { SubpathIter { subpath: self, index: 0, diff --git a/node-graph/gcore/src/instances.rs b/node-graph/gcore/src/instances.rs index 2de0faf11c..5b5be2a311 100644 --- a/node-graph/gcore/src/instances.rs +++ b/node-graph/gcore/src/instances.rs @@ -54,7 +54,7 @@ impl Instances { }) } - pub fn instance_ref_iter(&self) -> impl DoubleEndedIterator> + Clone { + pub fn instance_ref_iter(&self) -> impl DoubleEndedIterator> + Clone { self.instance .iter() .zip(self.transform.iter()) @@ -68,7 +68,7 @@ impl Instances { }) } - pub fn instance_mut_iter(&mut self) -> impl DoubleEndedIterator> { + pub fn instance_mut_iter(&mut self) -> impl DoubleEndedIterator> { self.instance .iter_mut() .zip(self.transform.iter_mut()) @@ -82,7 +82,7 @@ impl Instances { }) } - pub fn get(&self, index: usize) -> Option> { + pub fn get(&self, index: usize) -> Option> { if index >= self.instance.len() { return None; } @@ -95,7 +95,7 @@ impl Instances { }) } - pub fn get_mut(&mut self, index: usize) -> Option> { + pub fn get_mut(&mut self, index: usize) -> Option> { if index >= self.instance.len() { return None; } @@ -207,7 +207,7 @@ impl Instance { } } - pub fn to_instance_ref(&self) -> InstanceRef { + pub fn to_instance_ref(&self) -> InstanceRef<'_, T> { InstanceRef { instance: &self.instance, transform: &self.transform, @@ -216,7 +216,7 @@ impl Instance { } } - pub fn to_instance_mut(&mut self) -> InstanceMut { + pub fn to_instance_mut(&mut self) -> InstanceMut<'_, T> { InstanceMut { instance: &mut self.instance, transform: &mut self.transform, diff --git a/node-graph/gcore/src/memo.rs b/node-graph/gcore/src/memo.rs index e6400a2f61..66464eef4f 100644 --- a/node-graph/gcore/src/memo.rs +++ b/node-graph/gcore/src/memo.rs @@ -182,7 +182,7 @@ impl MemoHash { hasher.finish() } - pub fn inner_mut(&mut self) -> MemoHashGuard { + pub fn inner_mut(&mut self) -> MemoHashGuard<'_, T> { MemoHashGuard { inner: self } } pub fn into_inner(self) -> T { diff --git a/node-graph/gcore/src/text/to_path.rs b/node-graph/gcore/src/text/to_path.rs index 6b4bfc5e7a..9988fcae3e 100644 --- a/node-graph/gcore/src/text/to_path.rs +++ b/node-graph/gcore/src/text/to_path.rs @@ -208,7 +208,7 @@ pub fn bounding_box(str: &str, buzz_face: Option<&rustybuzz::Face>, typesetting: bounds } -pub fn load_face(data: &[u8]) -> rustybuzz::Face { +pub fn load_face(data: &[u8]) -> rustybuzz::Face<'_> { rustybuzz::Face::from_slice(data, 0).expect("Loading font failed") } diff --git a/node-graph/gcore/src/vector/vector_data/attributes.rs b/node-graph/gcore/src/vector/vector_data/attributes.rs index af1758ef2b..4d4511cefd 100644 --- a/node-graph/gcore/src/vector/vector_data/attributes.rs +++ b/node-graph/gcore/src/vector/vector_data/attributes.rs @@ -846,7 +846,7 @@ impl VectorData { }) } - pub fn build_stroke_path_iter(&self) -> StrokePathIter { + pub fn build_stroke_path_iter(&self) -> StrokePathIter<'_> { let mut points = vec![StrokePathIterPointMetadata::default(); self.point_domain.ids().len()]; for (segment_index, (&start, &end)) in self.segment_domain.start_point.iter().zip(&self.segment_domain.end_point).enumerate() { points[start].set(StrokePathIterPointSegmentMetadata::new(segment_index, false)); diff --git a/node-graph/gcore/src/vector/vector_nodes.rs b/node-graph/gcore/src/vector/vector_nodes.rs index c2d53e2982..e78a2acd05 100644 --- a/node-graph/gcore/src/vector/vector_nodes.rs +++ b/node-graph/gcore/src/vector/vector_nodes.rs @@ -25,11 +25,11 @@ use std::hash::{Hash, Hasher}; /// Implemented for types that can be converted to an iterator of vector data. /// Used for the fill and stroke node so they can be used on VectorData or GraphicGroup trait VectorDataTableIterMut { - fn vector_iter_mut(&mut self) -> impl Iterator>; + fn vector_iter_mut(&mut self) -> impl Iterator>; } impl VectorDataTableIterMut for GraphicGroupTable { - fn vector_iter_mut(&mut self) -> impl Iterator> { + fn vector_iter_mut(&mut self) -> impl Iterator> { // Grab only the direct children self.instance_mut_iter() .filter_map(|element| element.instance.as_vector_data_mut()) @@ -38,7 +38,7 @@ impl VectorDataTableIterMut for GraphicGroupTable { } impl VectorDataTableIterMut for VectorDataTable { - fn vector_iter_mut(&mut self) -> impl Iterator> { + fn vector_iter_mut(&mut self) -> impl Iterator> { self.instance_mut_iter() } } diff --git a/node-graph/graph-craft/src/document.rs b/node-graph/graph-craft/src/document.rs index 169fcd69e1..1ff4b4e35a 100644 --- a/node-graph/graph-craft/src/document.rs +++ b/node-graph/graph-craft/src/document.rs @@ -389,7 +389,7 @@ impl NodeInput { pub fn as_value(&self) -> Option<&TaggedValue> { if let NodeInput::Value { tagged_value, .. } = self { Some(tagged_value) } else { None } } - pub fn as_value_mut(&mut self) -> Option> { + pub fn as_value_mut(&mut self) -> Option> { if let NodeInput::Value { tagged_value, .. } = self { Some(tagged_value.inner_mut()) } else { None } } pub fn as_non_exposed_value(&self) -> Option<&TaggedValue> { @@ -1245,7 +1245,7 @@ impl NodeNetwork { } /// Create a [`RecursiveNodeIter`] that iterates over all [`DocumentNode`]s, including ones that are deeply nested. - pub fn recursive_nodes(&self) -> RecursiveNodeIter { + pub fn recursive_nodes(&self) -> RecursiveNodeIter<'_> { let nodes = self.nodes.iter().collect(); RecursiveNodeIter { nodes } } diff --git a/node-graph/graph-craft/src/graphene_compiler.rs b/node-graph/graph-craft/src/graphene_compiler.rs index 7eafc49844..d34cc6f663 100644 --- a/node-graph/graph-craft/src/graphene_compiler.rs +++ b/node-graph/graph-craft/src/graphene_compiler.rs @@ -32,5 +32,5 @@ impl Compiler { } pub trait Executor { - fn execute(&self, input: I) -> LocalFuture>>; + fn execute(&self, input: I) -> LocalFuture<'_, Result>>; } diff --git a/node-graph/interpreted-executor/src/dynamic_executor.rs b/node-graph/interpreted-executor/src/dynamic_executor.rs index f162bd1779..cca13cb3a8 100644 --- a/node-graph/interpreted-executor/src/dynamic_executor.rs +++ b/node-graph/interpreted-executor/src/dynamic_executor.rs @@ -120,7 +120,7 @@ impl Executor for &DynamicExecutor where I: StaticType + 'static + Send + Sync + std::panic::UnwindSafe, { - fn execute(&self, input: I) -> LocalFuture>> { + fn execute(&self, input: I) -> LocalFuture<'_, Result>> { Box::pin(async move { use futures::FutureExt; diff --git a/website/other/bezier-rs-demos/wasm/Cargo.toml b/website/other/bezier-rs-demos/wasm/Cargo.toml index c9b1d7f66a..72db425a98 100644 --- a/website/other/bezier-rs-demos/wasm/Cargo.toml +++ b/website/other/bezier-rs-demos/wasm/Cargo.toml @@ -34,7 +34,7 @@ wasm-opt = false [package.metadata.wasm-pack.profile.dev.wasm-bindgen] debug-js-glue = true demangle-name-section = true -dwarf-debug-info = true +dwarf-debug-info = false [package.metadata.wasm-pack.profile.release] wasm-opt = ["-Oz", "--enable-bulk-memory"] From dc0ae74cab5ad469399c502304ec40b32715fe9c Mon Sep 17 00:00:00 2001 From: Keavon Chambers Date: Sun, 22 Jun 2025 03:11:57 -0700 Subject: [PATCH 07/44] Fix double-click event firing when dragging number input fields in Chromium --- .../src/messages/layout/layout_message_handler.rs | 8 ++++++-- frontend/src/io-managers/input.ts | 13 ++++++++++--- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/editor/src/messages/layout/layout_message_handler.rs b/editor/src/messages/layout/layout_message_handler.rs index 4eeafb5eca..9bb786d81c 100644 --- a/editor/src/messages/layout/layout_message_handler.rs +++ b/editor/src/messages/layout/layout_message_handler.rs @@ -121,7 +121,10 @@ impl LayoutMessageHandler { }; (|| { - let update_value = value.as_object().expect("ColorInput update was not of type: object"); + let Some(update_value) = value.as_object() else { + warn!("ColorInput update was not of type: object"); + return Message::NoOp; + }; // None let is_none = update_value.get("none").and_then(|x| x.as_bool()); @@ -154,7 +157,8 @@ impl LayoutMessageHandler { return (color_button.on_update.callback)(color_button); } - panic!("ColorInput update was not able to be parsed with color data: {color_button:?}"); + warn!("ColorInput update was not able to be parsed with color data: {color_button:?}"); + Message::NoOp })() } }; diff --git a/frontend/src/io-managers/input.ts b/frontend/src/io-managers/input.ts index 94d3494e6e..c2956b498b 100644 --- a/frontend/src/io-managers/input.ts +++ b/frontend/src/io-managers/input.ts @@ -22,7 +22,7 @@ export const PRESS_REPEAT_DELAY_MS = 400; export const PRESS_REPEAT_INTERVAL_MS = 72; export const PRESS_REPEAT_INTERVAL_RAPID_MS = 10; -type EventName = keyof HTMLElementEventMap | keyof WindowEventHandlersEventMap | "modifyinputfield"; +type EventName = keyof HTMLElementEventMap | keyof WindowEventHandlersEventMap | "modifyinputfield" | "pointerlockchange" | "pointerlockerror"; type EventListenerTarget = { addEventListener: typeof window.addEventListener; removeEventListener: typeof window.removeEventListener; @@ -35,6 +35,7 @@ export function createInputManager(editor: Editor, dialog: DialogState, portfoli let viewportPointerInteractionOngoing = false; let textToolInteractiveInputElement = undefined as undefined | HTMLDivElement; let canvasFocused = true; + let inPointerLock = false; // Event listeners @@ -55,6 +56,8 @@ export function createInputManager(editor: Editor, dialog: DialogState, portfoli { target: window.document, eventName: "contextmenu", action: (e: MouseEvent) => onContextMenu(e) }, { target: window.document, eventName: "fullscreenchange", action: () => fullscreen.fullscreenModeChanged() }, { target: window.document.body, eventName: "paste", action: (e: ClipboardEvent) => onPaste(e) }, + { target: window.document, eventName: "pointerlockchange", action: onPointerLockChange }, + { target: window.document, eventName: "pointerlockerror", action: onPointerLockChange }, ]; // Event bindings @@ -209,9 +212,9 @@ export function createInputManager(editor: Editor, dialog: DialogState, portfoli } function onPotentialDoubleClick(e: MouseEvent) { - if (textToolInteractiveInputElement) return; + if (textToolInteractiveInputElement || inPointerLock) return; - // Allow only double-clicks + // Allow only repeated increments of double-clicks (not 1, 3, 5, etc.) if (e.detail % 2 == 1) return; // `e.buttons` is always 0 in the `mouseup` event, so we have to convert from `e.button` instead @@ -226,6 +229,10 @@ export function createInputManager(editor: Editor, dialog: DialogState, portfoli editor.handle.onDoubleClick(e.clientX, e.clientY, buttons, modifiers); } + function onPointerLockChange() { + inPointerLock = Boolean(window.document.pointerLockElement); + } + // Mouse events function onWheelScroll(e: WheelEvent) { From c1b15fcfdf68b086bf7985910cdf795f6ffd1b31 Mon Sep 17 00:00:00 2001 From: Keavon Chambers Date: Thu, 29 May 2025 03:08:04 -0700 Subject: [PATCH 08/44] Fix Ctrl+Space not closing the graph after opening the node creation menu --- .../components/floating-menus/MenuList.svelte | 2 +- frontend/src/components/views/Graph.svelte | 9 ++- .../src/components/widgets/WidgetSpan.svelte | 1 - frontend/src/io-managers/input.ts | 71 ++++++++++++------- 4 files changed, 53 insertions(+), 30 deletions(-) diff --git a/frontend/src/components/floating-menus/MenuList.svelte b/frontend/src/components/floating-menus/MenuList.svelte index c252876774..0695d38305 100644 --- a/frontend/src/components/floating-menus/MenuList.svelte +++ b/frontend/src/components/floating-menus/MenuList.svelte @@ -566,7 +566,7 @@ background: var(--color-e-nearwhite); color: var(--color-2-mildblack); - svg { + > .icon-label { fill: var(--color-2-mildblack); } } diff --git a/frontend/src/components/views/Graph.svelte b/frontend/src/components/views/Graph.svelte index 3cc63eac4d..59575d3141 100644 --- a/frontend/src/components/views/Graph.svelte +++ b/frontend/src/components/views/Graph.svelte @@ -137,7 +137,7 @@ await refreshWires(); } - function resolveWire(wire: FrontendNodeWire): { nodeOutput: SVGSVGElement | undefined; nodeInput: SVGSVGElement | undefined } { + function resolveWire(wire: FrontendNodeWire): { nodeOutput: SVGSVGElement; nodeInput: SVGSVGElement } | undefined { // TODO: Avoid the linear search const wireStartNodeIdIndex = Array.from($nodeGraph.nodes.keys()).findIndex((nodeId) => nodeId === (wire.wireStart as Node).nodeId); let nodeOutputConnectors = outputs[wireStartNodeIdIndex + 1]; @@ -146,6 +146,7 @@ } const indexOutput = Number(wire.wireStart.index); const nodeOutput = nodeOutputConnectors?.[indexOutput] as SVGSVGElement | undefined; + if (nodeOutput === undefined) return undefined; // TODO: Avoid the linear search const wireEndNodeIdIndex = Array.from($nodeGraph.nodes.keys()).findIndex((nodeId) => nodeId === (wire.wireEnd as Node).nodeId); @@ -155,6 +156,7 @@ } const indexInput = Number(wire.wireEnd.index); const nodeInput = nodeInputConnectors?.[indexInput] as SVGSVGElement | undefined; + if (nodeInput === undefined) return undefined; return { nodeOutput, nodeInput }; } @@ -177,8 +179,9 @@ nodeWirePaths = $nodeGraph.wires.flatMap((wire) => { // TODO: This call contains linear searches, which combined with the loop we're in, causes O(n^2) complexity as the graph grows - const { nodeOutput, nodeInput } = resolveWire(wire); - if (!nodeOutput || !nodeInput) return []; + const resolvedWires = resolveWire(wire); + if (!resolvedWires) return []; + const { nodeOutput, nodeInput } = resolvedWires; const wireStartNode = wire.wireStart.nodeId !== undefined ? $nodeGraph.nodes.get(wire.wireStart.nodeId) : undefined; const wireStart = wireStartNode?.isLayer || false; diff --git a/frontend/src/components/widgets/WidgetSpan.svelte b/frontend/src/components/widgets/WidgetSpan.svelte index a6331b593f..831e1dbbce 100644 --- a/frontend/src/components/widgets/WidgetSpan.svelte +++ b/frontend/src/components/widgets/WidgetSpan.svelte @@ -217,5 +217,4 @@ } } } - // paddingpaddingpaddingpaddingpaddingpaddingpaddingpaddingpaddingpaddingpaddingpaddingpaddingpaddingpaddingpaddingpaddingpaddingpaddingpadding diff --git a/frontend/src/io-managers/input.ts b/frontend/src/io-managers/input.ts index c2956b498b..bb7b035ceb 100644 --- a/frontend/src/io-managers/input.ts +++ b/frontend/src/io-managers/input.ts @@ -104,6 +104,7 @@ export function createInputManager(editor: Editor, dialog: DialogState, portfoli if (["KeyC", "KeyI", "KeyJ"].includes(key) && accelKey && e.shiftKey) return false; // Don't redirect tab or enter if not in canvas (to allow navigating elements) + potentiallyRestoreCanvasFocus(e); if (!canvasFocused && !targetIsTextField(e.target || undefined) && ["Tab", "Enter", "NumpadEnter", "Space", "ArrowDown", "ArrowLeft", "ArrowRight", "ArrowUp"].includes(key)) return false; // Don't redirect if a MenuList is open @@ -145,6 +146,8 @@ export function createInputManager(editor: Editor, dialog: DialogState, portfoli // While any pointer button is already down, additional button down events are not reported, but they are sent as `pointermove` events and these are handled in the backend function onPointerMove(e: PointerEvent) { + potentiallyRestoreCanvasFocus(e); + if (!e.buttons) viewportPointerInteractionOngoing = false; // Don't redirect pointer movement to the backend if there's no ongoing interaction and it's over a floating menu, or the graph overlay, on top of the canvas @@ -155,25 +158,15 @@ export function createInputManager(editor: Editor, dialog: DialogState, portfoli const inGraphOverlay = get(document).graphViewOverlayOpen; if (!viewportPointerInteractionOngoing && (inFloatingMenu || inGraphOverlay)) return; - const { target } = e; - const newInCanvasArea = (target instanceof Element && target.closest("[data-viewport], [data-graph]")) instanceof Element && !targetIsTextField(window.document.activeElement || undefined); - if (newInCanvasArea && !canvasFocused) { - canvasFocused = true; - app?.focus(); - } - const modifiers = makeKeyboardModifiersBitfield(e); editor.handle.onMouseMove(e.clientX, e.clientY, e.buttons, modifiers); } - function onMouseDown(e: MouseEvent) { - // Block middle mouse button auto-scroll mode (the circlar gizmo that appears and allows quick scrolling by moving the cursor above or below it) - if (e.button === BUTTON_MIDDLE) e.preventDefault(); - } - function onPointerDown(e: PointerEvent) { + potentiallyRestoreCanvasFocus(e); + const { target } = e; - const isTargetingCanvas = target instanceof Element && (target.closest("[data-viewport]") || target.closest("[data-node-graph]")); + const isTargetingCanvas = target instanceof Element && target.closest("[data-viewport], [data-node-graph]"); const inDialog = target instanceof Element && target.closest("[data-dialog] [data-floating-menu-content]"); const inContextMenu = target instanceof Element && target.closest("[data-context-menu]"); const inTextInput = target === textToolInteractiveInputElement; @@ -185,18 +178,23 @@ export function createInputManager(editor: Editor, dialog: DialogState, portfoli } if (!inTextInput && !inContextMenu) { - const isLeftOrRightClick = e.button === BUTTON_RIGHT || e.button === BUTTON_LEFT; - if (textToolInteractiveInputElement) editor.handle.onChangeText(textInputCleanup(textToolInteractiveInputElement.innerText), isLeftOrRightClick); - else viewportPointerInteractionOngoing = isTargetingCanvas instanceof Element; + if (textToolInteractiveInputElement) { + const isLeftOrRightClick = e.button === BUTTON_RIGHT || e.button === BUTTON_LEFT; + editor.handle.onChangeText(textInputCleanup(textToolInteractiveInputElement.innerText), isLeftOrRightClick); + } else { + viewportPointerInteractionOngoing = isTargetingCanvas instanceof Element; + } } - if (viewportPointerInteractionOngoing) { + if (viewportPointerInteractionOngoing && isTargetingCanvas instanceof Element) { const modifiers = makeKeyboardModifiersBitfield(e); editor.handle.onMouseDown(e.clientX, e.clientY, e.buttons, modifiers); } } function onPointerUp(e: PointerEvent) { + potentiallyRestoreCanvasFocus(e); + // Don't let the browser navigate back or forward when using the buttons on some mice // TODO: This works in Chrome but not in Firefox // TODO: Possible workaround: use the browser's history API to block navigation: @@ -211,9 +209,16 @@ export function createInputManager(editor: Editor, dialog: DialogState, portfoli editor.handle.onMouseUp(e.clientX, e.clientY, e.buttons, modifiers); } + // Mouse events + function onPotentialDoubleClick(e: MouseEvent) { if (textToolInteractiveInputElement || inPointerLock) return; + // Allow only events within the viewport or node graph boundaries + const { target } = e; + const isTargetingCanvas = target instanceof Element && target.closest("[data-viewport], [data-node-graph]"); + if (!(isTargetingCanvas instanceof Element)) return; + // Allow only repeated increments of double-clicks (not 1, 3, 5, etc.) if (e.detail % 2 == 1) return; @@ -229,15 +234,26 @@ export function createInputManager(editor: Editor, dialog: DialogState, portfoli editor.handle.onDoubleClick(e.clientX, e.clientY, buttons, modifiers); } + function onMouseDown(e: MouseEvent) { + // Block middle mouse button auto-scroll mode (the circlar gizmo that appears and allows quick scrolling by moving the cursor above or below it) + if (e.button === BUTTON_MIDDLE) e.preventDefault(); + } + + function onContextMenu(e: MouseEvent) { + if (!targetIsTextField(e.target || undefined) && e.target !== textToolInteractiveInputElement) { + e.preventDefault(); + } + } + function onPointerLockChange() { inPointerLock = Boolean(window.document.pointerLockElement); } - // Mouse events + // Wheel events function onWheelScroll(e: WheelEvent) { const { target } = e; - const isTargetingCanvas = target instanceof Element && (target.closest("[data-viewport]") || target.closest("[data-node-graph]")); + const isTargetingCanvas = target instanceof Element && target.closest("[data-viewport], [data-node-graph]"); // Redirect vertical scroll wheel movement into a horizontal scroll on a horizontally scrollable element // There seems to be no possible way to properly employ the browser's smooth scrolling interpolation @@ -254,12 +270,6 @@ export function createInputManager(editor: Editor, dialog: DialogState, portfoli } } - function onContextMenu(e: MouseEvent) { - if (!targetIsTextField(e.target || undefined) && e.target !== textToolInteractiveInputElement) { - e.preventDefault(); - } - } - // Receives a custom event dispatched when the user begins interactively editing with the text tool. // We keep a copy of the text input element to check against when it's active for text entry. function onModifyInputField(e: CustomEvent) { @@ -420,6 +430,17 @@ export function createInputManager(editor: Editor, dialog: DialogState, portfoli } }); + // Helper functions + + function potentiallyRestoreCanvasFocus(e: Event) { + const { target } = e; + const newInCanvasArea = (target instanceof Element && target.closest("[data-viewport], [data-graph]")) instanceof Element && !targetIsTextField(window.document.activeElement || undefined); + if (!canvasFocused && newInCanvasArea) { + canvasFocused = true; + app?.focus(); + } + } + // Initialization // Bind the event listeners From b5975e92b26ffd5efe8c7397f230b6eb8c942152 Mon Sep 17 00:00:00 2001 From: Keavon Chambers Date: Sun, 22 Jun 2025 04:22:29 -0700 Subject: [PATCH 09/44] Combine 'Merge by Distance' nodes with a choice of algorithm; clean up 'Boolean Operation' node result with merge-by-distance --- .../document/node_graph/node_properties.rs | 3 +- .../portfolio/portfolio_message_handler.rs | 42 ++++ .../vector/algorithms/merge_by_distance.rs | 2 +- node-graph/gcore/src/vector/misc.rs | 9 + node-graph/gcore/src/vector/vector_nodes.rs | 219 +++++++++--------- node-graph/graph-craft/src/document/value.rs | 1 + node-graph/gstd/src/vector.rs | 3 + 7 files changed, 167 insertions(+), 112 deletions(-) diff --git a/editor/src/messages/portfolio/document/node_graph/node_properties.rs b/editor/src/messages/portfolio/document/node_graph/node_properties.rs index a61c33a376..13d17755a9 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_properties.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_properties.rs @@ -23,8 +23,8 @@ use graphene_std::text::Font; use graphene_std::transform::{Footprint, ReferencePoint}; use graphene_std::vector::VectorDataTable; use graphene_std::vector::generator_nodes::grid; -use graphene_std::vector::misc::ArcType; use graphene_std::vector::misc::CentroidType; +use graphene_std::vector::misc::{ArcType, MergeByDistanceAlgorithm}; use graphene_std::vector::misc::{BooleanOperation, GridType}; use graphene_std::vector::style::{Fill, FillChoice, FillType, GradientStops}; use graphene_std::vector::style::{GradientType, PaintOrder, StrokeAlign, StrokeCap, StrokeJoin}; @@ -238,6 +238,7 @@ pub(crate) fn property_from_type( Some(x) if x == TypeId::of::() => enum_choice::().for_socket(default_info).property_row(), Some(x) if x == TypeId::of::() => enum_choice::().for_socket(default_info).property_row(), Some(x) if x == TypeId::of::() => enum_choice::().for_socket(default_info).property_row(), + Some(x) if x == TypeId::of::() => enum_choice::().for_socket(default_info).property_row(), Some(x) if x == TypeId::of::() => enum_choice::().for_socket(default_info).property_row(), Some(x) if x == TypeId::of::() => enum_choice::().for_socket(default_info).property_row(), Some(x) if x == TypeId::of::() => enum_choice::().for_socket(default_info).property_row(), diff --git a/editor/src/messages/portfolio/portfolio_message_handler.rs b/editor/src/messages/portfolio/portfolio_message_handler.rs index dac5225fd3..e834f0da23 100644 --- a/editor/src/messages/portfolio/portfolio_message_handler.rs +++ b/editor/src/messages/portfolio/portfolio_message_handler.rs @@ -1032,6 +1032,48 @@ impl MessageHandler> for PortfolioMes document.network_interface.replace_reference_name(node_id, network_path, "Auto-Tangents".to_string()); } + + if reference == "Merge by Distance" && inputs_count == 2 { + let node_definition = resolve_document_node_type("Merge by Distance").unwrap(); + let new_node_template = node_definition.default_node_template(); + let document_node = new_node_template.document_node; + document.network_interface.replace_implementation(node_id, network_path, document_node.implementation.clone()); + document + .network_interface + .replace_implementation_metadata(node_id, network_path, new_node_template.persistent_node_metadata); + + let old_inputs = document.network_interface.replace_inputs(node_id, document_node.inputs.clone(), network_path); + + document.network_interface.set_input(&InputConnector::node(*node_id, 0), old_inputs[0].clone(), network_path); + document.network_interface.set_input(&InputConnector::node(*node_id, 1), old_inputs[1].clone(), network_path); + document.network_interface.set_input( + &InputConnector::node(*node_id, 2), + NodeInput::value(TaggedValue::MergeByDistanceAlgorithm(graphene_std::vector::misc::MergeByDistanceAlgorithm::Topological), false), + network_path, + ); + } + + if reference == "Spatial Merge by Distance" { + let node_definition = resolve_document_node_type("Merge by Distance").unwrap(); + let new_node_template = node_definition.default_node_template(); + let document_node = new_node_template.document_node; + document.network_interface.replace_implementation(node_id, network_path, document_node.implementation.clone()); + document + .network_interface + .replace_implementation_metadata(node_id, network_path, new_node_template.persistent_node_metadata); + + let old_inputs = document.network_interface.replace_inputs(node_id, document_node.inputs.clone(), network_path); + + document.network_interface.set_input(&InputConnector::node(*node_id, 0), old_inputs[0].clone(), network_path); + document.network_interface.set_input(&InputConnector::node(*node_id, 1), old_inputs[1].clone(), network_path); + document.network_interface.set_input( + &InputConnector::node(*node_id, 2), + NodeInput::value(TaggedValue::MergeByDistanceAlgorithm(graphene_std::vector::misc::MergeByDistanceAlgorithm::Spatial), false), + network_path, + ); + + document.network_interface.replace_reference_name(node_id, network_path, "Merge by Distance".to_string()); + } } // TODO: Eventually remove this document upgrade code diff --git a/node-graph/gcore/src/vector/algorithms/merge_by_distance.rs b/node-graph/gcore/src/vector/algorithms/merge_by_distance.rs index c7fb75eaf0..99a94b3f5f 100644 --- a/node-graph/gcore/src/vector/algorithms/merge_by_distance.rs +++ b/node-graph/gcore/src/vector/algorithms/merge_by_distance.rs @@ -5,7 +5,7 @@ use rustc_hash::FxHashSet; impl VectorData { /// Collapse all points with edges shorter than the specified distance - pub(crate) fn merge_by_distance(&mut self, distance: f64) { + pub fn merge_by_distance(&mut self, distance: f64) { // Treat self as an undirected graph let indices = VectorDataIndex::build_from(self); diff --git a/node-graph/gcore/src/vector/misc.rs b/node-graph/gcore/src/vector/misc.rs index 8e275c97df..cd012746e8 100644 --- a/node-graph/gcore/src/vector/misc.rs +++ b/node-graph/gcore/src/vector/misc.rs @@ -94,6 +94,15 @@ pub enum ArcType { PieSlice, } +#[repr(C)] +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, serde::Serialize, serde::Deserialize, Hash, DynAny, specta::Type, node_macro::ChoiceType)] +#[widget(Radio)] +pub enum MergeByDistanceAlgorithm { + #[default] + Spatial, + Topological, +} + pub fn point_to_dvec2(point: Point) -> DVec2 { DVec2 { x: point.x, y: point.y } } diff --git a/node-graph/gcore/src/vector/vector_nodes.rs b/node-graph/gcore/src/vector/vector_nodes.rs index e78a2acd05..6d710c2560 100644 --- a/node-graph/gcore/src/vector/vector_nodes.rs +++ b/node-graph/gcore/src/vector/vector_nodes.rs @@ -9,7 +9,7 @@ use crate::raster_types::{CPU, RasterDataTable}; use crate::registry::types::{Angle, Fraction, IntegerCount, Length, Multiplier, Percentage, PixelLength, PixelSize, SeedValue}; use crate::renderer::GraphicElementRendered; use crate::transform::{Footprint, ReferencePoint, Transform}; -use crate::vector::misc::dvec2_to_point; +use crate::vector::misc::{MergeByDistanceAlgorithm, dvec2_to_point}; use crate::vector::style::{PaintOrder, StrokeAlign, StrokeCap, StrokeJoin}; use crate::vector::{FillId, PointDomain, RegionId}; use crate::{CloneVarArgs, Color, Context, Ctx, ExtractAll, GraphicElement, GraphicGroupTable, OwnedContextImpl}; @@ -549,135 +549,146 @@ async fn round_corners( result_table } -#[node_macro::node(name("Spatial Merge by Distance"), category("Debug"), path(graphene_core::vector))] -async fn spatial_merge_by_distance( +#[node_macro::node(name("Merge by Distance"), category("Vector"), path(graphene_core::vector))] +pub fn merge_by_distance( _: impl Ctx, vector_data: VectorDataTable, #[default(0.1)] #[hard_min(0.0001)] - distance: f64, + distance: Length, + algorithm: MergeByDistanceAlgorithm, ) -> VectorDataTable { let mut result_table = VectorDataTable::default(); - for mut vector_data_instance in vector_data.instance_iter() { - let vector_data_transform = vector_data_instance.transform; - let vector_data = vector_data_instance.instance; + match algorithm { + MergeByDistanceAlgorithm::Spatial => { + for mut vector_data_instance in vector_data.instance_iter() { + let vector_data_transform = vector_data_instance.transform; + let vector_data = vector_data_instance.instance; - let point_count = vector_data.point_domain.positions().len(); + let point_count = vector_data.point_domain.positions().len(); - // Find min x and y for grid cell normalization - let mut min_x = f64::MAX; - let mut min_y = f64::MAX; + // Find min x and y for grid cell normalization + let mut min_x = f64::MAX; + let mut min_y = f64::MAX; - // Calculate mins without collecting all positions - for &pos in vector_data.point_domain.positions() { - let transformed_pos = vector_data_transform.transform_point2(pos); - min_x = min_x.min(transformed_pos.x); - min_y = min_y.min(transformed_pos.y); - } + // Calculate mins without collecting all positions + for &pos in vector_data.point_domain.positions() { + let transformed_pos = vector_data_transform.transform_point2(pos); + min_x = min_x.min(transformed_pos.x); + min_y = min_y.min(transformed_pos.y); + } - // Create a spatial grid with cell size of 'distance' - use std::collections::HashMap; - let mut grid: HashMap<(i32, i32), Vec> = HashMap::new(); + // Create a spatial grid with cell size of 'distance' + use std::collections::HashMap; + let mut grid: HashMap<(i32, i32), Vec> = HashMap::new(); - // Add points to grid cells without collecting all positions first - for i in 0..point_count { - let pos = vector_data_transform.transform_point2(vector_data.point_domain.positions()[i]); - let grid_x = ((pos.x - min_x) / distance).floor() as i32; - let grid_y = ((pos.y - min_y) / distance).floor() as i32; + // Add points to grid cells without collecting all positions first + for i in 0..point_count { + let pos = vector_data_transform.transform_point2(vector_data.point_domain.positions()[i]); + let grid_x = ((pos.x - min_x) / distance).floor() as i32; + let grid_y = ((pos.y - min_y) / distance).floor() as i32; - grid.entry((grid_x, grid_y)).or_default().push(i); - } + grid.entry((grid_x, grid_y)).or_default().push(i); + } - // Create point index mapping for merged points - let mut point_index_map = vec![None; point_count]; - let mut merged_positions = Vec::new(); - let mut merged_indices = Vec::new(); + // Create point index mapping for merged points + let mut point_index_map = vec![None; point_count]; + let mut merged_positions = Vec::new(); + let mut merged_indices = Vec::new(); - // Process each point - for i in 0..point_count { - // Skip points that have already been processed - if point_index_map[i].is_some() { - continue; - } + // Process each point + for i in 0..point_count { + // Skip points that have already been processed + if point_index_map[i].is_some() { + continue; + } - let pos_i = vector_data_transform.transform_point2(vector_data.point_domain.positions()[i]); - let grid_x = ((pos_i.x - min_x) / distance).floor() as i32; - let grid_y = ((pos_i.y - min_y) / distance).floor() as i32; + let pos_i = vector_data_transform.transform_point2(vector_data.point_domain.positions()[i]); + let grid_x = ((pos_i.x - min_x) / distance).floor() as i32; + let grid_y = ((pos_i.y - min_y) / distance).floor() as i32; - let mut group = vec![i]; + let mut group = vec![i]; - // Check only neighboring cells (3x3 grid around current cell) - for dx in -1..=1 { - for dy in -1..=1 { - let neighbor_cell = (grid_x + dx, grid_y + dy); + // Check only neighboring cells (3x3 grid around current cell) + for dx in -1..=1 { + for dy in -1..=1 { + let neighbor_cell = (grid_x + dx, grid_y + dy); - if let Some(indices) = grid.get(&neighbor_cell) { - for &j in indices { - if j > i && point_index_map[j].is_none() { - let pos_j = vector_data_transform.transform_point2(vector_data.point_domain.positions()[j]); - if pos_i.distance(pos_j) <= distance { - group.push(j); + if let Some(indices) = grid.get(&neighbor_cell) { + for &j in indices { + if j > i && point_index_map[j].is_none() { + let pos_j = vector_data_transform.transform_point2(vector_data.point_domain.positions()[j]); + if pos_i.distance(pos_j) <= distance { + group.push(j); + } + } } } } } + + // Create merged point - calculate positions as needed + let merged_position = group + .iter() + .map(|&idx| vector_data_transform.transform_point2(vector_data.point_domain.positions()[idx])) + .fold(DVec2::ZERO, |sum, pos| sum + pos) + / group.len() as f64; + + let merged_position = vector_data_transform.inverse().transform_point2(merged_position); + let merged_index = merged_positions.len(); + + merged_positions.push(merged_position); + merged_indices.push(vector_data.point_domain.ids()[group[0]]); + + // Update mapping for all points in the group + for &idx in &group { + point_index_map[idx] = Some(merged_index); + } } - } - // Create merged point - calculate positions as needed - let merged_position = group - .iter() - .map(|&idx| vector_data_transform.transform_point2(vector_data.point_domain.positions()[idx])) - .fold(DVec2::ZERO, |sum, pos| sum + pos) - / group.len() as f64; + // Create new point domain with merged points + let mut new_point_domain = PointDomain::new(); + for (idx, pos) in merged_indices.into_iter().zip(merged_positions) { + new_point_domain.push(idx, pos); + } - let merged_position = vector_data_transform.inverse().transform_point2(merged_position); - let merged_index = merged_positions.len(); + // Update segment domain + let mut new_segment_domain = SegmentDomain::new(); + for segment_idx in 0..vector_data.segment_domain.ids().len() { + let id = vector_data.segment_domain.ids()[segment_idx]; + let start = vector_data.segment_domain.start_point()[segment_idx]; + let end = vector_data.segment_domain.end_point()[segment_idx]; + let handles = vector_data.segment_domain.handles()[segment_idx]; + let stroke = vector_data.segment_domain.stroke()[segment_idx]; - merged_positions.push(merged_position); - merged_indices.push(vector_data.point_domain.ids()[group[0]]); + // Get new indices for start and end points + let new_start = point_index_map[start].unwrap(); + let new_end = point_index_map[end].unwrap(); - // Update mapping for all points in the group - for &idx in &group { - point_index_map[idx] = Some(merged_index); + // Skip segments where start and end points were merged + if new_start != new_end { + new_segment_domain.push(id, new_start, new_end, handles, stroke); + } + } + + // Create new vector data + let mut result = vector_data.clone(); + result.point_domain = new_point_domain; + result.segment_domain = new_segment_domain; + + // Create and return the result + vector_data_instance.instance = result; + vector_data_instance.source_node_id = None; + result_table.push(vector_data_instance); } } - - // Create new point domain with merged points - let mut new_point_domain = PointDomain::new(); - for (idx, pos) in merged_indices.into_iter().zip(merged_positions) { - new_point_domain.push(idx, pos); - } - - // Update segment domain - let mut new_segment_domain = SegmentDomain::new(); - for segment_idx in 0..vector_data.segment_domain.ids().len() { - let id = vector_data.segment_domain.ids()[segment_idx]; - let start = vector_data.segment_domain.start_point()[segment_idx]; - let end = vector_data.segment_domain.end_point()[segment_idx]; - let handles = vector_data.segment_domain.handles()[segment_idx]; - let stroke = vector_data.segment_domain.stroke()[segment_idx]; - - // Get new indices for start and end points - let new_start = point_index_map[start].unwrap(); - let new_end = point_index_map[end].unwrap(); - - // Skip segments where start and end points were merged - if new_start != new_end { - new_segment_domain.push(id, new_start, new_end, handles, stroke); + MergeByDistanceAlgorithm::Topological => { + for mut source_instance in vector_data.instance_iter() { + source_instance.instance.merge_by_distance(distance); + result_table.push(source_instance); } } - - // Create new vector data - let mut result = vector_data.clone(); - result.point_domain = new_point_domain; - result.segment_domain = new_segment_domain; - - // Create and return the result - vector_data_instance.instance = result; - vector_data_instance.source_node_id = None; - result_table.push(vector_data_instance); } result_table @@ -1859,18 +1870,6 @@ fn point_inside(_: impl Ctx, source: VectorDataTable, point: DVec2) -> bool { source.instance_iter().any(|instance| instance.instance.check_point_inside_shape(instance.transform, point)) } -#[node_macro::node(name("Merge by Distance"), category("Vector"), path(graphene_core::vector))] -fn merge_by_distance(_: impl Ctx, source: VectorDataTable, #[default(10.)] distance: Length) -> VectorDataTable { - let mut result_table = VectorDataTable::default(); - - for mut source_instance in source.instance_iter() { - source_instance.instance.merge_by_distance(distance); - result_table.push(source_instance); - } - - result_table -} - #[node_macro::node(category("Vector"), path(graphene_core::vector))] async fn area(ctx: impl Ctx + CloneVarArgs + ExtractAll, vector_data: impl Node, Output = VectorDataTable>) -> f64 { let new_ctx = OwnedContextImpl::from(ctx).with_footprint(Footprint::default()).into_context(); diff --git a/node-graph/graph-craft/src/document/value.rs b/node-graph/graph-craft/src/document/value.rs index 94aa05342f..f641555d99 100644 --- a/node-graph/graph-craft/src/document/value.rs +++ b/node-graph/graph-craft/src/document/value.rs @@ -233,6 +233,7 @@ tagged_value! { SelectiveColorChoice(graphene_core::raster::SelectiveColorChoice), GridType(graphene_core::vector::misc::GridType), ArcType(graphene_core::vector::misc::ArcType), + MergeByDistanceAlgorithm(graphene_core::vector::misc::MergeByDistanceAlgorithm), #[serde(alias = "LineCap")] StrokeCap(graphene_core::vector::style::StrokeCap), #[serde(alias = "LineJoin")] diff --git a/node-graph/gstd/src/vector.rs b/node-graph/gstd/src/vector.rs index 1e84ed7a95..6d7ea1ce9a 100644 --- a/node-graph/gstd/src/vector.rs +++ b/node-graph/gstd/src/vector.rs @@ -41,6 +41,9 @@ async fn boolean_operation + 'n + Send + Clone>( VectorData::transform(result_vector_data.instance, transform); result_vector_data.instance.style.set_stroke_transform(DAffine2::IDENTITY); result_vector_data.instance.upstream_graphic_group = Some(group_of_paths.clone()); + + // Clean up the boolean operation result by merging duplicated points + result_vector_data.instance.merge_by_distance(0.001); } result_vector_data_table From 930278128d1af2d29f859e56f9076e2b00cd6616 Mon Sep 17 00:00:00 2001 From: Priyanshu Date: Mon, 23 Jun 2025 10:29:25 +0530 Subject: [PATCH 10/44] New nodes: 'Path Length', 'Count', and 'Split Path' (#2731) * impl path length node * test 'Path Length' node implementation * improve test * impl 'Count' node to return the number of instance in a VectorDataTable instances * impl 'Split Path' node * don't split if t is close of 0 or 1 or the bezpath is empty * write comments * preserve the style on vector data in 'Split Path' node implementation * Code review --------- Co-authored-by: Keavon Chambers --- .../vector/algorithms/bezpath_algorithms.rs | 49 +++++++++ node-graph/gcore/src/vector/vector_nodes.rs | 99 ++++++++++++++++++- 2 files changed, 145 insertions(+), 3 deletions(-) diff --git a/node-graph/gcore/src/vector/algorithms/bezpath_algorithms.rs b/node-graph/gcore/src/vector/algorithms/bezpath_algorithms.rs index 7dd6f11c4c..fa7682e63b 100644 --- a/node-graph/gcore/src/vector/algorithms/bezpath_algorithms.rs +++ b/node-graph/gcore/src/vector/algorithms/bezpath_algorithms.rs @@ -3,6 +3,55 @@ use crate::vector::misc::dvec2_to_point; use glam::DVec2; use kurbo::{BezPath, DEFAULT_ACCURACY, Line, ParamCurve, ParamCurveDeriv, PathEl, PathSeg, Point, Rect, Shape}; +/// Splits the [`BezPath`] at `t` value which lie in the range of [0, 1]. +/// Returns [`None`] if the given [`BezPath`] has no segments or `t` is within f64::EPSILON of 0 or 1. +pub fn split_bezpath(bezpath: &BezPath, t: f64, euclidian: bool) -> Option<(BezPath, BezPath)> { + if t <= f64::EPSILON || (1. - t) <= f64::EPSILON || bezpath.segments().count() == 0 { + return None; + } + + // Get the segment which lies at the split. + let (segment_index, t) = t_value_to_parametric(bezpath, t, euclidian, None); + let segment = bezpath.get_seg(segment_index + 1).unwrap(); + + // Divide the segment. + let first_segment = segment.subsegment(0.0..t); + let second_segment = segment.subsegment(t..1.); + + let mut first_bezpath = BezPath::new(); + let mut second_bezpath = BezPath::new(); + + // Append the segments up to the subdividing segment from original bezpath to first bezpath. + for segment in bezpath.segments().take(segment_index) { + if first_bezpath.elements().is_empty() { + first_bezpath.move_to(segment.start()); + } + first_bezpath.push(segment.as_path_el()); + } + + // Append the first segment of the subdivided segment. + if first_bezpath.elements().is_empty() { + first_bezpath.move_to(first_segment.start()); + } + first_bezpath.push(first_segment.as_path_el()); + + // Append the second segment of the subdivided segment in the second bezpath. + if second_bezpath.elements().is_empty() { + second_bezpath.move_to(second_segment.start()); + } + second_bezpath.push(second_segment.as_path_el()); + + // Append the segments after the subdividing segment from original bezpath to second bezpath. + for segment in bezpath.segments().skip(segment_index + 1) { + if second_bezpath.elements().is_empty() { + second_bezpath.move_to(segment.start()); + } + second_bezpath.push(segment.as_path_el()); + } + + Some((first_bezpath, second_bezpath)) +} + pub fn position_on_bezpath(bezpath: &BezPath, t: f64, euclidian: bool, segments_length: Option<&[f64]>) -> Point { let (segment_index, t) = t_value_to_parametric(bezpath, t, euclidian, segments_length); bezpath.get_seg(segment_index + 1).unwrap().eval(t) diff --git a/node-graph/gcore/src/vector/vector_nodes.rs b/node-graph/gcore/src/vector/vector_nodes.rs index 6d710c2560..c8030b8f48 100644 --- a/node-graph/gcore/src/vector/vector_nodes.rs +++ b/node-graph/gcore/src/vector/vector_nodes.rs @@ -1,11 +1,11 @@ -use super::algorithms::bezpath_algorithms::{self, position_on_bezpath, sample_points_on_bezpath, tangent_on_bezpath}; +use super::algorithms::bezpath_algorithms::{self, position_on_bezpath, sample_points_on_bezpath, split_bezpath, tangent_on_bezpath}; use super::algorithms::offset_subpath::offset_subpath; use super::algorithms::spline::{solve_spline_first_handle_closed, solve_spline_first_handle_open}; use super::misc::{CentroidType, point_to_dvec2}; use super::style::{Fill, Gradient, GradientStops, Stroke}; use super::{PointId, SegmentDomain, SegmentId, StrokeId, VectorData, VectorDataTable}; use crate::instances::{Instance, InstanceMut, Instances}; -use crate::raster_types::{CPU, RasterDataTable}; +use crate::raster_types::{CPU, GPU, RasterDataTable}; use crate::registry::types::{Angle, Fraction, IntegerCount, Length, Multiplier, Percentage, PixelLength, PixelSize, SeedValue}; use crate::renderer::GraphicElementRendered; use crate::transform::{Footprint, ReferencePoint, Transform}; @@ -1314,6 +1314,45 @@ async fn sample_points(_: impl Ctx, vector_data: VectorDataTable, spacing: f64, result_table } +#[node_macro::node(category("Vector"), path(graphene_core::vector))] +async fn split_path(_: impl Ctx, mut vector_data: VectorDataTable, t_value: f64, parameterized_distance: bool, reverse: bool) -> VectorDataTable { + let euclidian = !parameterized_distance; + + let bezpaths = vector_data + .instance_ref_iter() + .enumerate() + .flat_map(|(instance_row_index, vector_data)| vector_data.instance.stroke_bezpath_iter().map(|bezpath| (instance_row_index, bezpath)).collect::>()) + .collect::>(); + + let bezpath_count = bezpaths.len() as f64; + let t_value = t_value.clamp(0., bezpath_count); + let t_value = if reverse { bezpath_count - t_value } else { t_value }; + let index = if t_value >= bezpath_count { (bezpath_count - 1.) as usize } else { t_value as usize }; + + if let Some((instance_row_index, bezpath)) = bezpaths.get(index).cloned() { + let mut result_vector_data = VectorData { + style: vector_data.get(instance_row_index).unwrap().instance.style.clone(), + ..Default::default() + }; + + for (_, (_, bezpath)) in bezpaths.iter().enumerate().filter(|(i, (ri, _))| *i != index && *ri == instance_row_index) { + result_vector_data.append_bezpath(bezpath.clone()); + } + let t = if t_value == bezpath_count { 1. } else { t_value.fract() }; + + if let Some((first, second)) = split_bezpath(&bezpath, t, euclidian) { + result_vector_data.append_bezpath(first); + result_vector_data.append_bezpath(second); + } else { + result_vector_data.append_bezpath(bezpath); + } + + *vector_data.get_mut(instance_row_index).unwrap().instance = result_vector_data; + } + + vector_data +} + /// Determines the position of a point on the path, given by its progress from 0 to 1 along the path. /// If multiple subpaths make up the path, the whole number part of the progress value selects the subpath and the decimal part determines the position along it. #[node_macro::node(name("Position on Path"), category("Vector"), path(graphene_core::vector))] @@ -1870,6 +1909,29 @@ fn point_inside(_: impl Ctx, source: VectorDataTable, point: DVec2) -> bool { source.instance_iter().any(|instance| instance.instance.check_point_inside_shape(instance.transform, point)) } +#[node_macro::node(category("Vector"), path(graphene_core::vector))] +async fn count_elements(_: impl Ctx, #[implementations(GraphicGroupTable, VectorDataTable, RasterDataTable, RasterDataTable)] source: Instances) -> u64 { + source.instance_iter().count() as u64 +} + +#[node_macro::node(category("Vector"), path(graphene_core::vector))] +async fn path_length(_: impl Ctx, source: VectorDataTable) -> f64 { + source + .instance_iter() + .map(|vector_data_instance| { + let transform = vector_data_instance.transform; + vector_data_instance + .instance + .stroke_bezpath_iter() + .map(|mut bezpath| { + bezpath.apply_affine(Affine::new(transform.to_cols_array())); + bezpath.perimeter(DEFAULT_ACCURACY) + }) + .sum::() + }) + .sum() +} + #[node_macro::node(category("Vector"), path(graphene_core::vector))] async fn area(ctx: impl Ctx + CloneVarArgs + ExtractAll, vector_data: impl Node, Output = VectorDataTable>) -> f64 { let new_ctx = OwnedContextImpl::from(ctx).with_footprint(Footprint::default()).into_context(); @@ -1942,6 +2004,7 @@ mod test { use super::*; use crate::Node; use bezier_rs::Bezier; + use kurbo::Rect; use std::pin::Pin; #[derive(Clone)] @@ -1959,6 +2022,24 @@ mod test { VectorDataTable::new(VectorData::from_subpath(data)) } + fn create_vector_data_instance(bezpath: BezPath, transform: DAffine2) -> Instance { + let mut instance = VectorData::default(); + instance.append_bezpath(bezpath); + Instance { + instance, + transform, + ..Default::default() + } + } + + fn vector_node_from_instances(data: Vec>) -> VectorDataTable { + let mut vector_data_table = VectorDataTable::default(); + for instance in data { + vector_data_table.push(instance); + } + vector_data_table + } + #[tokio::test] async fn repeat() { let direction = DVec2::X * 1.5; @@ -2085,12 +2166,24 @@ mod test { } } #[tokio::test] - async fn lengths() { + async fn segment_lengths() { let subpath = Subpath::from_bezier(&Bezier::from_cubic_dvec2(DVec2::ZERO, DVec2::ZERO, DVec2::X * 100., DVec2::X * 100.)); let lengths = subpath_segment_lengths(Footprint::default(), vector_node(subpath)).await; assert_eq!(lengths, vec![100.]); } #[tokio::test] + async fn path_length() { + let bezpath = Rect::new(100., 100., 201., 201.).to_path(DEFAULT_ACCURACY); + let transform = DAffine2::from_scale(DVec2::new(2., 2.)); + let instance = create_vector_data_instance(bezpath, transform); + let instances = (0..5).map(|_| instance.clone()).collect::>>(); + + let length = super::path_length(Footprint::default(), vector_node_from_instances(instances)).await; + + // 4040 equals 101 * 4 (rectangle perimeter) * 2 (scale) * 5 (number of rows) + assert_eq!(length, 4040.); + } + #[tokio::test] async fn spline() { let spline = super::spline(Footprint::default(), vector_node(Subpath::new_rect(DVec2::ZERO, DVec2::ONE * 100.))).await; let spline = spline.instance_ref_iter().next().unwrap().instance; From ae88f4a3de8f3126cd5ee74687bd7525bf2ef94c Mon Sep 17 00:00:00 2001 From: Keavon Chambers Date: Sun, 22 Jun 2025 23:18:34 -0700 Subject: [PATCH 11/44] Replace all hard-coded magic number node input indices with *Input::INDEX constants --- .../node_graph/node_graph_message_handler.rs | 2 +- .../document/node_graph/node_properties.rs | 277 +++++++++--------- node-graph/gcore/src/raster/adjustments.rs | 12 + 3 files changed, 157 insertions(+), 134 deletions(-) diff --git a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs index 50d0a8e22f..182a3dc44d 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs @@ -567,7 +567,7 @@ impl<'a> MessageHandler> for NodeGrap responses.add(DocumentMessage::AddTransaction); let new_ids: HashMap<_, _> = data.iter().map(|(id, _)| (*id, NodeId::new())).collect(); - let nodes: Vec<_> = new_ids.iter().map(|(_, id)| *id).collect(); + let nodes: Vec<_> = new_ids.values().copied().collect(); responses.add(NodeGraphMessage::AddNodes { nodes: data, new_ids: new_ids.clone(), diff --git a/editor/src/messages/portfolio/document/node_graph/node_properties.rs b/editor/src/messages/portfolio/document/node_graph/node_properties.rs index 13d17755a9..1f6a797fd5 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_properties.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_properties.rs @@ -22,7 +22,6 @@ use graphene_std::raster_types::{CPU, GPU, RasterDataTable}; use graphene_std::text::Font; use graphene_std::transform::{Footprint, ReferencePoint}; use graphene_std::vector::VectorDataTable; -use graphene_std::vector::generator_nodes::grid; use graphene_std::vector::misc::CentroidType; use graphene_std::vector::misc::{ArcType, MergeByDistanceAlgorithm}; use graphene_std::vector::misc::{BooleanOperation, GridType}; @@ -939,8 +938,7 @@ pub fn get_document_node<'a>(node_id: NodeId, context: &'a NodePropertiesContext } pub fn query_node_and_input_info<'a>(node_id: NodeId, input_index: usize, context: &'a NodePropertiesContext<'a>) -> Result<(&'a DocumentNode, &'a str, &'a str), String> { - let node_id2 = node_id.clone(); - let document_node = get_document_node(node_id2, context)?; + let document_node = get_document_node(node_id, context)?; let input_name = context.network_interface.input_name(node_id, input_index, context.selection_network_path).unwrap_or_else(|| { log::warn!("input name not found in query_node_and_input_info"); "" @@ -982,16 +980,19 @@ pub fn query_noise_pattern_state(node_id: NodeId, context: &NodePropertiesContex } pub fn query_assign_colors_randomize(node_id: NodeId, context: &NodePropertiesContext) -> Result { + use graphene_std::vector::assign_colors::*; + let document_node = get_document_node(node_id, context)?; // This is safe since the node is a proto node and the implementation cannot be changed. - let randomize_index = 5; - Ok(match document_node.inputs.get(randomize_index).and_then(|input| input.as_value()) { + Ok(match document_node.inputs.get(RandomizeInput::INDEX).and_then(|input| input.as_value()) { Some(TaggedValue::Bool(randomize_enabled)) => *randomize_enabled, _ => false, }) } pub(crate) fn brightness_contrast_properties(node_id: NodeId, context: &mut NodePropertiesContext) -> Vec { + use graphene_std::raster::brightness_contrast::*; + let document_node = match get_document_node(node_id, context) { Ok(document_node) => document_node, Err(err) => { @@ -1001,17 +1002,18 @@ pub(crate) fn brightness_contrast_properties(node_id: NodeId, context: &mut Node }; // Use Classic - let use_classic_index = 3; - let use_classic = bool_widget(ParameterWidgetsInfo::from_index(document_node, node_id, use_classic_index, true, context), CheckboxInput::default()); - let use_classic_value = match document_node.inputs[use_classic_index].as_value() { + let use_classic = bool_widget( + ParameterWidgetsInfo::from_index(document_node, node_id, UseClassicInput::INDEX, true, context), + CheckboxInput::default(), + ); + let use_classic_value = match document_node.inputs[UseClassicInput::INDEX].as_value() { Some(TaggedValue::Bool(use_classic_choice)) => *use_classic_choice, _ => false, }; // Brightness - let brightness_index = 1; let brightness = number_widget( - ParameterWidgetsInfo::from_index(document_node, node_id, brightness_index, true, context), + ParameterWidgetsInfo::from_index(document_node, node_id, BrightnessInput::INDEX, true, context), NumberInput::default() .unit("%") .mode_range() @@ -1021,9 +1023,8 @@ pub(crate) fn brightness_contrast_properties(node_id: NodeId, context: &mut Node ); // Contrast - let contrast_index = 2; let contrast = number_widget( - ParameterWidgetsInfo::from_index(document_node, node_id, contrast_index, true, context), + ParameterWidgetsInfo::from_index(document_node, node_id, ContrastInput::INDEX, true, context), NumberInput::default() .unit("%") .mode_range() @@ -1042,6 +1043,8 @@ pub(crate) fn brightness_contrast_properties(node_id: NodeId, context: &mut Node } pub(crate) fn channel_mixer_properties(node_id: NodeId, context: &mut NodePropertiesContext) -> Vec { + use graphene_std::raster::channel_mixer::*; + let document_node = match get_document_node(node_id, context) { Ok(document_node) => document_node, Err(err) => { @@ -1051,20 +1054,21 @@ pub(crate) fn channel_mixer_properties(node_id: NodeId, context: &mut NodeProper }; // Monochrome - let monochrome_index = 1; - let is_monochrome = bool_widget(ParameterWidgetsInfo::from_index(document_node, node_id, monochrome_index, true, context), CheckboxInput::default()); - let is_monochrome_value = match document_node.inputs[monochrome_index].as_value() { + let is_monochrome = bool_widget( + ParameterWidgetsInfo::from_index(document_node, node_id, MonochromeInput::INDEX, true, context), + CheckboxInput::default(), + ); + let is_monochrome_value = match document_node.inputs[MonochromeInput::INDEX].as_value() { Some(TaggedValue::Bool(monochrome_choice)) => *monochrome_choice, _ => false, }; // Output channel choice - let output_channel_index = 18; let output_channel = enum_choice::() - .for_socket(ParameterWidgetsInfo::from_index(document_node, node_id, output_channel_index, true, context)) + .for_socket(ParameterWidgetsInfo::from_index(document_node, node_id, OutputChannelInput::INDEX, true, context)) .exposable(false) .property_row(); - let output_channel_value = match &document_node.inputs[output_channel_index].as_value() { + let output_channel_value = match &document_node.inputs[OutputChannelInput::INDEX].as_value() { Some(TaggedValue::RedGreenBlue(choice)) => choice, _ => { warn!("Channel Mixer node properties panel could not be displayed."); @@ -1074,10 +1078,10 @@ pub(crate) fn channel_mixer_properties(node_id: NodeId, context: &mut NodeProper // Output Channel modes let (red_output_index, green_output_index, blue_output_index, constant_output_index) = match (is_monochrome_value, output_channel_value) { - (true, _) => (2, 3, 4, 5), - (false, RedGreenBlue::Red) => (6, 7, 8, 9), - (false, RedGreenBlue::Green) => (10, 11, 12, 13), - (false, RedGreenBlue::Blue) => (14, 15, 16, 17), + (true, _) => (MonochromeRInput::INDEX, MonochromeGInput::INDEX, MonochromeBInput::INDEX, MonochromeCInput::INDEX), + (false, RedGreenBlue::Red) => (RedRInput::INDEX, RedGInput::INDEX, RedBInput::INDEX, RedCInput::INDEX), + (false, RedGreenBlue::Green) => (GreenRInput::INDEX, GreenGInput::INDEX, GreenBInput::INDEX, GreenCInput::INDEX), + (false, RedGreenBlue::Blue) => (BlueRInput::INDEX, BlueGInput::INDEX, BlueBInput::INDEX, BlueCInput::INDEX), }; let number_input = NumberInput::default().mode_range().min(-200.).max(200.).unit("%"); let red = number_widget(ParameterWidgetsInfo::from_index(document_node, node_id, red_output_index, true, context), number_input.clone()); @@ -1102,6 +1106,8 @@ pub(crate) fn channel_mixer_properties(node_id: NodeId, context: &mut NodeProper } pub(crate) fn selective_color_properties(node_id: NodeId, context: &mut NodePropertiesContext) -> Vec { + use graphene_std::raster::selective_color::*; + let document_node = match get_document_node(node_id, context) { Ok(document_node) => document_node, Err(err) => { @@ -1109,15 +1115,14 @@ pub(crate) fn selective_color_properties(node_id: NodeId, context: &mut NodeProp return Vec::new(); } }; - // Colors choice - let colors_index = 38; + // Colors choice let colors = enum_choice::() - .for_socket(ParameterWidgetsInfo::from_index(document_node, node_id, colors_index, true, context)) + .for_socket(ParameterWidgetsInfo::from_index(document_node, node_id, ColorsInput::INDEX, true, context)) .exposable(false) .property_row(); - let colors_choice_index = match &document_node.inputs[colors_index].as_value() { + let colors_choice = match &document_node.inputs[ColorsInput::INDEX].as_value() { Some(TaggedValue::SelectiveColorChoice(choice)) => choice, _ => { warn!("Selective Color node properties panel could not be displayed."); @@ -1126,16 +1131,16 @@ pub(crate) fn selective_color_properties(node_id: NodeId, context: &mut NodeProp }; // CMYK - let (c_index, m_index, y_index, k_index) = match colors_choice_index { - SelectiveColorChoice::Reds => (2, 3, 4, 5), - SelectiveColorChoice::Yellows => (6, 7, 8, 9), - SelectiveColorChoice::Greens => (10, 11, 12, 13), - SelectiveColorChoice::Cyans => (14, 15, 16, 17), - SelectiveColorChoice::Blues => (18, 19, 20, 21), - SelectiveColorChoice::Magentas => (22, 23, 24, 25), - SelectiveColorChoice::Whites => (26, 27, 28, 29), - SelectiveColorChoice::Neutrals => (30, 31, 32, 33), - SelectiveColorChoice::Blacks => (34, 35, 36, 37), + let (c_index, m_index, y_index, k_index) = match colors_choice { + SelectiveColorChoice::Reds => (RCInput::INDEX, RMInput::INDEX, RYInput::INDEX, RKInput::INDEX), + SelectiveColorChoice::Yellows => (YCInput::INDEX, YMInput::INDEX, YYInput::INDEX, YKInput::INDEX), + SelectiveColorChoice::Greens => (GCInput::INDEX, GMInput::INDEX, GYInput::INDEX, GKInput::INDEX), + SelectiveColorChoice::Cyans => (CCInput::INDEX, CMInput::INDEX, CYInput::INDEX, CKInput::INDEX), + SelectiveColorChoice::Blues => (BCInput::INDEX, BMInput::INDEX, BYInput::INDEX, BKInput::INDEX), + SelectiveColorChoice::Magentas => (MCInput::INDEX, MMInput::INDEX, MYInput::INDEX, MKInput::INDEX), + SelectiveColorChoice::Whites => (WCInput::INDEX, WMInput::INDEX, WYInput::INDEX, WKInput::INDEX), + SelectiveColorChoice::Neutrals => (NCInput::INDEX, NMInput::INDEX, NYInput::INDEX, NKInput::INDEX), + SelectiveColorChoice::Blacks => (KCInput::INDEX, KMInput::INDEX, KYInput::INDEX, KKInput::INDEX), }; let number_input = NumberInput::default().mode_range().min(-100.).max(100.).unit("%"); let cyan = number_widget(ParameterWidgetsInfo::from_index(document_node, node_id, c_index, true, context), number_input.clone()); @@ -1144,9 +1149,8 @@ pub(crate) fn selective_color_properties(node_id: NodeId, context: &mut NodeProp let black = number_widget(ParameterWidgetsInfo::from_index(document_node, node_id, k_index, true, context), number_input); // Mode - let mode_index = 1; let mode = enum_choice::() - .for_socket(ParameterWidgetsInfo::from_index(document_node, node_id, mode_index, true, context)) + .for_socket(ParameterWidgetsInfo::from_index(document_node, node_id, ModeInput::INDEX, true, context)) .property_row(); vec![ @@ -1163,11 +1167,7 @@ pub(crate) fn selective_color_properties(node_id: NodeId, context: &mut NodeProp } pub(crate) fn grid_properties(node_id: NodeId, context: &mut NodePropertiesContext) -> Vec { - let grid_type_index = grid::GridTypeInput::INDEX; - let spacing_index = grid::SpacingInput::::INDEX; - let angles_index = grid::AnglesInput::INDEX; - let rows_index = grid::RowsInput::INDEX; - let columns_index = grid::ColumnsInput::INDEX; + use graphene_std::vector::generator_nodes::grid::*; let document_node = match get_document_node(node_id, context) { Ok(document_node) => document_node, @@ -1177,36 +1177,48 @@ pub(crate) fn grid_properties(node_id: NodeId, context: &mut NodePropertiesConte } }; let grid_type = enum_choice::() - .for_socket(ParameterWidgetsInfo::from_index(document_node, node_id, grid_type_index, true, context)) + .for_socket(ParameterWidgetsInfo::from_index(document_node, node_id, GridTypeInput::INDEX, true, context)) .property_row(); let mut widgets = vec![grid_type]; - let Some(grid_type_input) = document_node.inputs.get(grid_type_index) else { + let Some(grid_type_input) = document_node.inputs.get(GridTypeInput::INDEX) else { log::warn!("A widget failed to be built because its node's input index is invalid."); return vec![]; }; if let Some(&TaggedValue::GridType(grid_type)) = grid_type_input.as_non_exposed_value() { match grid_type { GridType::Rectangular => { - let spacing = coordinate_widget(ParameterWidgetsInfo::from_index(document_node, node_id, spacing_index, true, context), "W", "H", " px", Some(0.)); + let spacing = coordinate_widget( + ParameterWidgetsInfo::from_index(document_node, node_id, SpacingInput::::INDEX, true, context), + "W", + "H", + " px", + Some(0.), + ); widgets.push(spacing); } GridType::Isometric => { let spacing = LayoutGroup::Row { widgets: number_widget( - ParameterWidgetsInfo::from_index(document_node, node_id, spacing_index, true, context), + ParameterWidgetsInfo::from_index(document_node, node_id, SpacingInput::::INDEX, true, context), NumberInput::default().label("H").min(0.).unit(" px"), ), }; - let angles = coordinate_widget(ParameterWidgetsInfo::from_index(document_node, node_id, angles_index, true, context), "", "", "°", None); + let angles = coordinate_widget(ParameterWidgetsInfo::from_index(document_node, node_id, AnglesInput::INDEX, true, context), "", "", "°", None); widgets.extend([spacing, angles]); } } } - let rows = number_widget(ParameterWidgetsInfo::from_index(document_node, node_id, rows_index, true, context), NumberInput::default().min(1.)); - let columns = number_widget(ParameterWidgetsInfo::from_index(document_node, node_id, columns_index, true, context), NumberInput::default().min(1.)); + let rows = number_widget( + ParameterWidgetsInfo::from_index(document_node, node_id, RowsInput::INDEX, true, context), + NumberInput::default().min(1.), + ); + let columns = number_widget( + ParameterWidgetsInfo::from_index(document_node, node_id, ColumnsInput::INDEX, true, context), + NumberInput::default().min(1.), + ); widgets.extend([LayoutGroup::Row { widgets: rows }, LayoutGroup::Row { widgets: columns }]); @@ -1214,6 +1226,8 @@ pub(crate) fn grid_properties(node_id: NodeId, context: &mut NodePropertiesConte } pub(crate) fn exposure_properties(node_id: NodeId, context: &mut NodePropertiesContext) -> Vec { + use graphene_std::raster::exposure::*; + let document_node = match get_document_node(node_id, context) { Ok(document_node) => document_node, Err(err) => { @@ -1221,10 +1235,16 @@ pub(crate) fn exposure_properties(node_id: NodeId, context: &mut NodePropertiesC return Vec::new(); } }; - let exposure = number_widget(ParameterWidgetsInfo::from_index(document_node, node_id, 1, true, context), NumberInput::default().min(-20.).max(20.)); - let offset = number_widget(ParameterWidgetsInfo::from_index(document_node, node_id, 2, true, context), NumberInput::default().min(-0.5).max(0.5)); + let exposure = number_widget( + ParameterWidgetsInfo::from_index(document_node, node_id, ExposureInput::INDEX, true, context), + NumberInput::default().min(-20.).max(20.), + ); + let offset = number_widget( + ParameterWidgetsInfo::from_index(document_node, node_id, OffsetInput::INDEX, true, context), + NumberInput::default().min(-0.5).max(0.5), + ); let gamma_correction = number_widget( - ParameterWidgetsInfo::from_index(document_node, node_id, 3, true, context), + ParameterWidgetsInfo::from_index(document_node, node_id, GammaCorrectionInput::INDEX, true, context), NumberInput::default().min(0.01).max(9.99).increment_step(0.1), ); @@ -1236,6 +1256,8 @@ pub(crate) fn exposure_properties(node_id: NodeId, context: &mut NodePropertiesC } pub(crate) fn rectangle_properties(node_id: NodeId, context: &mut NodePropertiesContext) -> Vec { + use graphene_std::vector::generator_nodes::rectangle::*; + let document_node = match get_document_node(node_id, context) { Ok(document_node) => document_node, Err(err) => { @@ -1243,21 +1265,15 @@ pub(crate) fn rectangle_properties(node_id: NodeId, context: &mut NodeProperties return Vec::new(); } }; - let size_x_index = 1; - let size_y_index = 2; - let corner_rounding_type_index = 3; - let corner_radius_index = 4; - let clamped_index = 5; - // Size X - let size_x = number_widget(ParameterWidgetsInfo::from_index(document_node, node_id, size_x_index, true, context), NumberInput::default()); + let size_x = number_widget(ParameterWidgetsInfo::from_index(document_node, node_id, WidthInput::INDEX, true, context), NumberInput::default()); // Size Y - let size_y = number_widget(ParameterWidgetsInfo::from_index(document_node, node_id, size_y_index, true, context), NumberInput::default()); + let size_y = number_widget(ParameterWidgetsInfo::from_index(document_node, node_id, HeightInput::INDEX, true, context), NumberInput::default()); // Corner Radius let mut corner_radius_row_1 = start_widgets( - ParameterWidgetsInfo::from_index(document_node, node_id, corner_radius_index, true, context), + ParameterWidgetsInfo::from_index(document_node, node_id, CornerRadiusInput::::INDEX, true, context), FrontendGraphDataType::Number, ); corner_radius_row_1.push(Separator::new(SeparatorType::Unrelated).widget_holder()); @@ -1266,13 +1282,13 @@ pub(crate) fn rectangle_properties(node_id: NodeId, context: &mut NodeProperties corner_radius_row_2.push(TextLabel::new("").widget_holder()); add_blank_assist(&mut corner_radius_row_2); - let Some(input) = document_node.inputs.get(corner_rounding_type_index) else { + let Some(input) = document_node.inputs.get(IndividualCornerRadiiInput::INDEX) else { log::warn!("A widget failed to be built because its node's input index is invalid."); return vec![]; }; if let Some(&TaggedValue::Bool(is_individual)) = input.as_non_exposed_value() { // Values - let Some(input) = document_node.inputs.get(corner_radius_index) else { + let Some(input) = document_node.inputs.get(CornerRadiusInput::::INDEX) else { log::warn!("A widget failed to be built because its node's input index is invalid."); return vec![]; }; @@ -1294,13 +1310,13 @@ pub(crate) fn rectangle_properties(node_id: NodeId, context: &mut NodeProperties Message::Batched(Box::new([ NodeGraphMessage::SetInputValue { node_id, - input_index: corner_rounding_type_index, + input_index: IndividualCornerRadiiInput::INDEX, value: TaggedValue::Bool(false), } .into(), NodeGraphMessage::SetInputValue { node_id, - input_index: corner_radius_index, + input_index: CornerRadiusInput::::INDEX, value: TaggedValue::F64(uniform_val), } .into(), @@ -1313,13 +1329,13 @@ pub(crate) fn rectangle_properties(node_id: NodeId, context: &mut NodeProperties Message::Batched(Box::new([ NodeGraphMessage::SetInputValue { node_id, - input_index: corner_rounding_type_index, + input_index: IndividualCornerRadiiInput::INDEX, value: TaggedValue::Bool(true), } .into(), NodeGraphMessage::SetInputValue { node_id, - input_index: corner_radius_index, + input_index: CornerRadiusInput::::INDEX, value: TaggedValue::F64Array4(individual_val), } .into(), @@ -1346,12 +1362,12 @@ pub(crate) fn rectangle_properties(node_id: NodeId, context: &mut NodeProperties }; TextInput::default() .value(individual_val.iter().map(|v| v.to_string()).collect::>().join(", ")) - .on_update(optionally_update_value(move |x: &TextInput| from_string(&x.value), node_id, corner_radius_index)) + .on_update(optionally_update_value(move |x: &TextInput| from_string(&x.value), node_id, CornerRadiusInput::::INDEX)) .widget_holder() } else { NumberInput::default() .value(Some(uniform_val)) - .on_update(update_value(move |x: &NumberInput| TaggedValue::F64(x.value.unwrap()), node_id, corner_radius_index)) + .on_update(update_value(move |x: &NumberInput| TaggedValue::F64(x.value.unwrap()), node_id, CornerRadiusInput::::INDEX)) .on_commit(commit_value) .widget_holder() }; @@ -1359,7 +1375,7 @@ pub(crate) fn rectangle_properties(node_id: NodeId, context: &mut NodeProperties } // Clamped - let clamped = bool_widget(ParameterWidgetsInfo::from_index(document_node, node_id, clamped_index, true, context), CheckboxInput::default()); + let clamped = bool_widget(ParameterWidgetsInfo::from_index(document_node, node_id, ClampedInput::INDEX, true, context), CheckboxInput::default()); vec![ LayoutGroup::Row { widgets: size_x }, @@ -1486,6 +1502,8 @@ pub(crate) fn generate_node_properties(node_id: NodeId, context: &mut NodeProper /// Fill Node Widgets LayoutGroup pub(crate) fn fill_properties(node_id: NodeId, context: &mut NodePropertiesContext) -> Vec { + use graphene_std::vector::fill::*; + let document_node = match get_document_node(node_id, context) { Ok(document_node) => document_node, Err(err) => { @@ -1493,16 +1511,16 @@ pub(crate) fn fill_properties(node_id: NodeId, context: &mut NodePropertiesConte return Vec::new(); } }; - let fill_index = 1; - let backup_color_index = 2; - let backup_gradient_index = 3; - let mut widgets_first_row = start_widgets(ParameterWidgetsInfo::from_index(document_node, node_id, fill_index, true, context), FrontendGraphDataType::General); + let mut widgets_first_row = start_widgets( + ParameterWidgetsInfo::from_index(document_node, node_id, FillInput::::INDEX, true, context), + FrontendGraphDataType::General, + ); let (fill, backup_color, backup_gradient) = if let (Some(TaggedValue::Fill(fill)), &Some(&TaggedValue::OptionalColor(backup_color)), Some(TaggedValue::Gradient(backup_gradient))) = ( - &document_node.inputs[fill_index].as_value(), - &document_node.inputs[backup_color_index].as_value(), - &document_node.inputs[backup_gradient_index].as_value(), + &document_node.inputs[FillInput::::INDEX].as_value(), + &document_node.inputs[BackupColorInput::INDEX].as_value(), + &document_node.inputs[BackupGradientInput::INDEX].as_value(), ) { (fill, backup_color, backup_gradient) } else { @@ -1521,26 +1539,26 @@ pub(crate) fn fill_properties(node_id: NodeId, context: &mut NodePropertiesConte match &fill2 { Fill::None => NodeGraphMessage::SetInputValue { node_id, - input_index: backup_color_index, + input_index: BackupColorInput::INDEX, value: TaggedValue::OptionalColor(None), } .into(), Fill::Solid(color) => NodeGraphMessage::SetInputValue { node_id, - input_index: backup_color_index, + input_index: BackupColorInput::INDEX, value: TaggedValue::OptionalColor(Some(*color)), } .into(), Fill::Gradient(gradient) => NodeGraphMessage::SetInputValue { node_id, - input_index: backup_gradient_index, + input_index: BackupGradientInput::INDEX, value: TaggedValue::Gradient(gradient.clone()), } .into(), }, NodeGraphMessage::SetInputValue { node_id, - input_index: fill_index, + input_index: FillInput::::INDEX, value: TaggedValue::Fill(x.value.to_fill(fill2.as_gradient())), } .into(), @@ -1568,7 +1586,7 @@ pub(crate) fn fill_properties(node_id: NodeId, context: &mut NodePropertiesConte } }, node_id, - fill_index, + FillInput::::INDEX, )) .widget_holder(); row.push(Separator::new(SeparatorType::Unrelated).widget_holder()); @@ -1579,11 +1597,11 @@ pub(crate) fn fill_properties(node_id: NodeId, context: &mut NodePropertiesConte let entries = vec![ RadioEntryData::new("solid") .label("Solid") - .on_update(update_value(move |_| TaggedValue::Fill(backup_color_fill.clone()), node_id, fill_index)) + .on_update(update_value(move |_| TaggedValue::Fill(backup_color_fill.clone()), node_id, FillInput::::INDEX)) .on_commit(commit_value), RadioEntryData::new("gradient") .label("Gradient") - .on_update(update_value(move |_| TaggedValue::Fill(backup_gradient_fill.clone()), node_id, fill_index)) + .on_update(update_value(move |_| TaggedValue::Fill(backup_gradient_fill.clone()), node_id, FillInput::::INDEX)) .on_commit(commit_value), ]; @@ -1618,7 +1636,7 @@ pub(crate) fn fill_properties(node_id: NodeId, context: &mut NodePropertiesConte } }, node_id, - fill_index, + FillInput::::INDEX, )) .widget_holder(); row.push(Separator::new(SeparatorType::Unrelated).widget_holder()); @@ -1639,7 +1657,7 @@ pub(crate) fn fill_properties(node_id: NodeId, context: &mut NodePropertiesConte TaggedValue::Fill(Fill::Gradient(new_gradient)) }, node_id, - fill_index, + FillInput::::INDEX, )) .on_commit(commit_value), RadioEntryData::new("Radial") @@ -1651,7 +1669,7 @@ pub(crate) fn fill_properties(node_id: NodeId, context: &mut NodePropertiesConte TaggedValue::Fill(Fill::Gradient(new_gradient)) }, node_id, - fill_index, + FillInput::::INDEX, )) .on_commit(commit_value), ]; @@ -1668,6 +1686,8 @@ pub(crate) fn fill_properties(node_id: NodeId, context: &mut NodePropertiesConte } pub fn stroke_properties(node_id: NodeId, context: &mut NodePropertiesContext) -> Vec { + use graphene_std::vector::stroke::*; + let document_node = match get_document_node(node_id, context) { Ok(document_node) => document_node, Err(err) => { @@ -1675,34 +1695,28 @@ pub fn stroke_properties(node_id: NodeId, context: &mut NodePropertiesContext) - return Vec::new(); } }; - let color_index = graphene_std::vector::stroke::ColorInput::>::INDEX; - let weight_index = graphene_std::vector::stroke::WeightInput::INDEX; - let align_index = graphene_std::vector::stroke::AlignInput::INDEX; - let cap_index = graphene_std::vector::stroke::CapInput::INDEX; - let join_index = graphene_std::vector::stroke::JoinInput::INDEX; - let miter_limit_index = graphene_std::vector::stroke::MiterLimitInput::INDEX; - let paint_order_index = graphene_std::vector::stroke::PaintOrderInput::INDEX; - let dash_lengths_index = graphene_std::vector::stroke::DashLengthsInput::INDEX; - let dash_offset_index = graphene_std::vector::stroke::DashOffsetInput::INDEX; - let color = color_widget(ParameterWidgetsInfo::from_index(document_node, node_id, color_index, true, context), ColorInput::default()); + let color = color_widget( + ParameterWidgetsInfo::from_index(document_node, node_id, ColorInput::>::INDEX, true, context), + crate::messages::layout::utility_types::widgets::button_widgets::ColorInput::default(), + ); let weight = number_widget( - ParameterWidgetsInfo::from_index(document_node, node_id, weight_index, true, context), + ParameterWidgetsInfo::from_index(document_node, node_id, WeightInput::INDEX, true, context), NumberInput::default().unit(" px").min(0.), ); let align = enum_choice::() - .for_socket(ParameterWidgetsInfo::from_index(document_node, node_id, align_index, true, context)) + .for_socket(ParameterWidgetsInfo::from_index(document_node, node_id, AlignInput::INDEX, true, context)) .property_row(); let cap = enum_choice::() - .for_socket(ParameterWidgetsInfo::from_index(document_node, node_id, cap_index, true, context)) + .for_socket(ParameterWidgetsInfo::from_index(document_node, node_id, CapInput::INDEX, true, context)) .property_row(); let join = enum_choice::() - .for_socket(ParameterWidgetsInfo::from_index(document_node, node_id, join_index, true, context)) + .for_socket(ParameterWidgetsInfo::from_index(document_node, node_id, JoinInput::INDEX, true, context)) .property_row(); let miter_limit = number_widget( - ParameterWidgetsInfo::from_index(document_node, node_id, miter_limit_index, true, context), + ParameterWidgetsInfo::from_index(document_node, node_id, MiterLimitInput::INDEX, true, context), NumberInput::default().min(0.).disabled({ - let join_value = match &document_node.inputs[join_index].as_value() { + let join_value = match &document_node.inputs[JoinInput::INDEX].as_value() { Some(TaggedValue::StrokeJoin(x)) => x, _ => &StrokeJoin::Miter, }; @@ -1710,18 +1724,18 @@ pub fn stroke_properties(node_id: NodeId, context: &mut NodePropertiesContext) - }), ); let paint_order = enum_choice::() - .for_socket(ParameterWidgetsInfo::from_index(document_node, node_id, paint_order_index, true, context)) + .for_socket(ParameterWidgetsInfo::from_index(document_node, node_id, PaintOrderInput::INDEX, true, context)) .property_row(); - let dash_lengths_val = match &document_node.inputs[dash_lengths_index].as_value() { + let dash_lengths_val = match &document_node.inputs[DashLengthsInput::INDEX].as_value() { Some(TaggedValue::VecF64(x)) => x, _ => &vec![], }; let dash_lengths = array_of_number_widget( - ParameterWidgetsInfo::from_index(document_node, node_id, dash_lengths_index, true, context), + ParameterWidgetsInfo::from_index(document_node, node_id, DashLengthsInput::INDEX, true, context), TextInput::default().centered(true), ); let number_input = NumberInput::default().unit(" px").disabled(dash_lengths_val.is_empty()); - let dash_offset = number_widget(ParameterWidgetsInfo::from_index(document_node, node_id, dash_offset_index, true, context), number_input); + let dash_offset = number_widget(ParameterWidgetsInfo::from_index(document_node, node_id, DashOffsetInput::INDEX, true, context), number_input); vec![ color, @@ -1737,6 +1751,8 @@ pub fn stroke_properties(node_id: NodeId, context: &mut NodePropertiesContext) - } pub fn offset_path_properties(node_id: NodeId, context: &mut NodePropertiesContext) -> Vec { + use graphene_std::vector::offset_path::*; + let document_node = match get_document_node(node_id, context) { Ok(document_node) => document_node, Err(err) => { @@ -1744,30 +1760,28 @@ pub fn offset_path_properties(node_id: NodeId, context: &mut NodePropertiesConte return Vec::new(); } }; - let distance_index = graphene_std::vector::offset_path::DistanceInput::INDEX; - let join_index = graphene_std::vector::offset_path::JoinInput::INDEX; - let miter_limit_index = graphene_std::vector::offset_path::MiterLimitInput::INDEX; - let number_input = NumberInput::default().unit(" px"); - let distance = number_widget(ParameterWidgetsInfo::from_index(document_node, node_id, distance_index, true, context), number_input); + let distance = number_widget(ParameterWidgetsInfo::from_index(document_node, node_id, DistanceInput::INDEX, true, context), number_input); let join = enum_choice::() - .for_socket(ParameterWidgetsInfo::from_index(document_node, node_id, join_index, true, context)) + .for_socket(ParameterWidgetsInfo::from_index(document_node, node_id, JoinInput::INDEX, true, context)) .property_row(); let number_input = NumberInput::default().min(0.).disabled({ - let join_val = match &document_node.inputs[join_index].as_value() { + let join_val = match &document_node.inputs[JoinInput::INDEX].as_value() { Some(TaggedValue::StrokeJoin(x)) => x, _ => &StrokeJoin::Miter, }; join_val != &StrokeJoin::Miter }); - let miter_limit = number_widget(ParameterWidgetsInfo::from_index(document_node, node_id, miter_limit_index, true, context), number_input); + let miter_limit = number_widget(ParameterWidgetsInfo::from_index(document_node, node_id, MiterLimitInput::INDEX, true, context), number_input); vec![LayoutGroup::Row { widgets: distance }, join, LayoutGroup::Row { widgets: miter_limit }] } pub fn math_properties(node_id: NodeId, context: &mut NodePropertiesContext) -> Vec { + use graphene_std::ops::math::*; + let document_node = match get_document_node(node_id, context) { Ok(document_node) => document_node, Err(err) => { @@ -1776,16 +1790,13 @@ pub fn math_properties(node_id: NodeId, context: &mut NodePropertiesContext) -> } }; - let expression_index = 1; - let operation_b_index = 2; - let expression = (|| { let mut widgets = start_widgets( - ParameterWidgetsInfo::from_index(document_node, node_id, expression_index, true, context), + ParameterWidgetsInfo::from_index(document_node, node_id, ExpressionInput::INDEX, true, context), FrontendGraphDataType::General, ); - let Some(input) = document_node.inputs.get(expression_index) else { + let Some(input) = document_node.inputs.get(ExpressionInput::INDEX) else { log::warn!("A widget failed to be built because its node's input index is invalid."); return vec![]; }; @@ -1809,7 +1820,7 @@ pub fn math_properties(node_id: NodeId, context: &mut NodePropertiesContext) -> }) }, node_id, - expression_index, + ExpressionInput::INDEX, )) .on_commit(commit_value) .widget_holder(), @@ -1817,7 +1828,10 @@ pub fn math_properties(node_id: NodeId, context: &mut NodePropertiesContext) -> } widgets })(); - let operand_b = number_widget(ParameterWidgetsInfo::from_index(document_node, node_id, operation_b_index, true, context), NumberInput::default()); + let operand_b = number_widget( + ParameterWidgetsInfo::from_index(document_node, node_id, OperandBInput::::INDEX, true, context), + NumberInput::default(), + ); let operand_a_hint = vec![TextLabel::new("(Operand A is the primary input)").widget_holder()]; vec![ @@ -1925,17 +1939,16 @@ pub mod choice { C: Fn(&()) -> Message + 'static + Send + Sync, { let items = E::list() - .into_iter() + .iter() .map(|group| { group - .into_iter() + .iter() .map(|(item, metadata)| { - let item = item.clone(); let updater = updater_factory(); let committer = committer_factory(); MenuListEntry::new(metadata.name.as_ref()) .label(metadata.label.as_ref()) - .on_update(move |_| updater(&item)) + .on_update(move |_| updater(item)) .on_commit(committer) }) .collect() @@ -1950,14 +1963,12 @@ pub mod choice { C: Fn(&()) -> Message + 'static + Send + Sync, { let items = E::list() - .into_iter() - .map(|group| group.into_iter()) - .flatten() + .iter() + .flat_map(|group| group.iter()) .map(|(item, var_meta)| { - let item = item.clone(); let updater = updater_factory(); let committer = committer_factory(); - let entry = RadioEntryData::new(var_meta.name.as_ref()).on_update(move |_| updater(&item)).on_commit(committer); + let entry = RadioEntryData::new(var_meta.name.as_ref()).on_update(move |_| updater(item)).on_commit(committer); match (var_meta.icon.as_deref(), var_meta.docstring.as_deref()) { (None, None) => entry.label(var_meta.label.as_ref()), (None, Some(doc)) => entry.label(var_meta.label.as_ref()).tooltip(doc), @@ -2027,7 +2038,7 @@ pub mod choice { return LayoutGroup::Row { widgets: vec![] }; }; - let input: Option = input.as_non_exposed_value().and_then(|v| <&W::Value as TryFrom<&TaggedValue>>::try_from(v).ok()).map(Clone::clone); + let input: Option = input.as_non_exposed_value().and_then(|v| <&W::Value as TryFrom<&TaggedValue>>::try_from(v).ok()).cloned(); if let Some(current) = input { let committer = || super::commit_value; diff --git a/node-graph/gcore/src/raster/adjustments.rs b/node-graph/gcore/src/raster/adjustments.rs index 762034bfb0..2d952a4292 100644 --- a/node-graph/gcore/src/raster/adjustments.rs +++ b/node-graph/gcore/src/raster/adjustments.rs @@ -1021,6 +1021,7 @@ async fn channel_mixer>( mut image: T, monochrome: bool, + #[default(40.)] #[name("Red")] monochrome_r: f64, @@ -1144,43 +1145,54 @@ async fn selective_color>( GradientStops, )] mut image: T, + mode: RelativeAbsolute, + #[name("(Reds) Cyan")] r_c: f64, #[name("(Reds) Magenta")] r_m: f64, #[name("(Reds) Yellow")] r_y: f64, #[name("(Reds) Black")] r_k: f64, + #[name("(Yellows) Cyan")] y_c: f64, #[name("(Yellows) Magenta")] y_m: f64, #[name("(Yellows) Yellow")] y_y: f64, #[name("(Yellows) Black")] y_k: f64, + #[name("(Greens) Cyan")] g_c: f64, #[name("(Greens) Magenta")] g_m: f64, #[name("(Greens) Yellow")] g_y: f64, #[name("(Greens) Black")] g_k: f64, + #[name("(Cyans) Cyan")] c_c: f64, #[name("(Cyans) Magenta")] c_m: f64, #[name("(Cyans) Yellow")] c_y: f64, #[name("(Cyans) Black")] c_k: f64, + #[name("(Blues) Cyan")] b_c: f64, #[name("(Blues) Magenta")] b_m: f64, #[name("(Blues) Yellow")] b_y: f64, #[name("(Blues) Black")] b_k: f64, + #[name("(Magentas) Cyan")] m_c: f64, #[name("(Magentas) Magenta")] m_m: f64, #[name("(Magentas) Yellow")] m_y: f64, #[name("(Magentas) Black")] m_k: f64, + #[name("(Whites) Cyan")] w_c: f64, #[name("(Whites) Magenta")] w_m: f64, #[name("(Whites) Yellow")] w_y: f64, #[name("(Whites) Black")] w_k: f64, + #[name("(Neutrals) Cyan")] n_c: f64, #[name("(Neutrals) Magenta")] n_m: f64, #[name("(Neutrals) Yellow")] n_y: f64, #[name("(Neutrals) Black")] n_k: f64, + #[name("(Blacks) Cyan")] k_c: f64, #[name("(Blacks) Magenta")] k_m: f64, #[name("(Blacks) Yellow")] k_y: f64, #[name("(Blacks) Black")] k_k: f64, + _colors: SelectiveColorChoice, ) -> T { image.adjust(|color| { From 0e8eb481bf7a97b86b6a88055584ff6362d5b8b9 Mon Sep 17 00:00:00 2001 From: Firestar99 Date: Mon, 23 Jun 2025 11:35:14 +0200 Subject: [PATCH 12/44] Extract `gapplication_io` from `gcore` (#2742) move `gcore::application_io` into the new crate `gapplication-io`, remove features `wasm` and `wgpu` from `gcore` --- Cargo.lock | 17 ++++++++++++- Cargo.toml | 2 ++ frontend/wasm/Cargo.toml | 2 +- node-graph/gapplication-io/Cargo.toml | 25 +++++++++++++++++++ .../src/lib.rs} | 11 +++++--- node-graph/gcore/Cargo.toml | 4 +-- .../gcore/src/graphic_element/renderer.rs | 2 +- node-graph/gcore/src/lib.rs | 8 ------ node-graph/graph-craft/Cargo.toml | 1 + node-graph/graph-craft/src/document/value.rs | 11 ++++---- .../graph-craft/src/wasm_application_io.rs | 10 ++++---- node-graph/graphene-cli/src/main.rs | 6 ++--- node-graph/gstd/Cargo.toml | 5 ++-- node-graph/gstd/src/lib.rs | 1 + node-graph/gstd/src/wasm_application_io.rs | 8 +++--- .../interpreted-executor/src/node_registry.rs | 6 ++--- node-graph/wgpu-executor/Cargo.toml | 3 ++- node-graph/wgpu-executor/src/lib.rs | 6 ++--- 18 files changed, 84 insertions(+), 44 deletions(-) create mode 100644 node-graph/gapplication-io/Cargo.toml rename node-graph/{gcore/src/application_io.rs => gapplication-io/src/lib.rs} (96%) diff --git a/Cargo.lock b/Cargo.lock index 22ad5e1e8c..9a3c0711b8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2130,6 +2130,7 @@ dependencies = [ "dyn-any", "glam", "graph-craft", + "graphene-application-io", "graphene-core", "iai-callgrind", "js-sys", @@ -2148,6 +2149,19 @@ dependencies = [ "winit", ] +[[package]] +name = "graphene-application-io" +version = "0.1.0" +dependencies = [ + "dyn-any", + "glam", + "graphene-core", + "log", + "serde", + "web-sys", + "wgpu", +] + [[package]] name = "graphene-cli" version = "0.1.0" @@ -2196,7 +2210,6 @@ dependencies = [ "tokio", "usvg", "vello", - "web-sys", "wgpu", ] @@ -2212,6 +2225,7 @@ dependencies = [ "futures", "glam", "graph-craft", + "graphene-application-io", "graphene-core", "image", "log", @@ -7386,6 +7400,7 @@ dependencies = [ "dyn-any", "futures", "glam", + "graphene-application-io", "graphene-core", "node-macro", "vello", diff --git a/Cargo.toml b/Cargo.toml index 959f200bf3..5d3730d0a7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,6 +4,7 @@ members = [ "proc-macros", "frontend/wasm", "frontend/src-tauri", + "node-graph/gapplication-io", "node-graph/gcore", "node-graph/gstd", "node-graph/graph-craft", @@ -35,6 +36,7 @@ bezier-rs = { path = "libraries/bezier-rs", features = ["dyn-any", "serde"] } dyn-any = { path = "libraries/dyn-any", features = ["derive", "glam", "reqwest", "log-bad-types", "rc"] } math-parser = { path = "libraries/math-parser" } path-bool = { path = "libraries/path-bool" } +graphene-application-io = { path = "node-graph/gapplication-io" } graphene-core = { path = "node-graph/gcore" } graph-craft = { path = "node-graph/graph-craft" } graphene-std = { path = "node-graph/gstd" } diff --git a/frontend/wasm/Cargo.toml b/frontend/wasm/Cargo.toml index 9182f1ad92..44ac26c2da 100644 --- a/frontend/wasm/Cargo.toml +++ b/frontend/wasm/Cargo.toml @@ -29,7 +29,7 @@ editor = { path = "../../editor", package = "graphite-editor", features = [ # Workspace dependencies graph-craft = { workspace = true } log = { workspace = true } -graphene-core = { workspace = true, features = ["wasm"] } +graphene-core = { workspace = true } serde = { workspace = true } wasm-bindgen = { workspace = true } serde-wasm-bindgen = { workspace = true } diff --git a/node-graph/gapplication-io/Cargo.toml b/node-graph/gapplication-io/Cargo.toml new file mode 100644 index 0000000000..98051ce63c --- /dev/null +++ b/node-graph/gapplication-io/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "graphene-application-io" +version = "0.1.0" +edition = "2024" +description = "graphene application io interface" +authors = ["Graphite Authors "] +license = "MIT OR Apache-2.0" + +[features] +wasm = ["dep:web-sys"] +wgpu = ["dep:wgpu"] + +[dependencies] +# Local dependencies +dyn-any = { workspace = true } +graphene-core = { workspace = true } + +# Workspace dependencies +glam = { workspace = true } +serde = { workspace = true } +log = { workspace = true } + +# Optional workspace dependencies +web-sys = { workspace = true, optional = true } +wgpu = { workspace = true, optional = true } diff --git a/node-graph/gcore/src/application_io.rs b/node-graph/gapplication-io/src/lib.rs similarity index 96% rename from node-graph/gcore/src/application_io.rs rename to node-graph/gapplication-io/src/lib.rs index c25da5fc20..06275445c9 100644 --- a/node-graph/gcore/src/application_io.rs +++ b/node-graph/gapplication-io/src/lib.rs @@ -1,8 +1,8 @@ -use crate::text::FontCache; -use crate::transform::Footprint; -use crate::vector::style::ViewMode; use dyn_any::{DynAny, StaticType, StaticTypeSized}; use glam::{DAffine2, UVec2}; +use graphene_core::text::FontCache; +use graphene_core::transform::Footprint; +use graphene_core::vector::style::ViewMode; use std::fmt::Debug; use std::future::Future; use std::hash::{Hash, Hasher}; @@ -131,6 +131,11 @@ unsafe impl StaticType for SurfaceHandleFrame { type Static = SurfaceHandleFrame; } +#[cfg(feature = "wasm")] +pub type WasmSurfaceHandle = SurfaceHandle; +#[cfg(feature = "wasm")] +pub type WasmSurfaceHandleFrame = SurfaceHandleFrame; + // TODO: think about how to automatically clean up memory /* impl<'a, Surface> Drop for SurfaceHandle<'a, Surface> { diff --git a/node-graph/gcore/Cargo.toml b/node-graph/gcore/Cargo.toml index e1a004237c..01dd3b12c6 100644 --- a/node-graph/gcore/Cargo.toml +++ b/node-graph/gcore/Cargo.toml @@ -7,10 +7,9 @@ authors = ["Graphite Authors "] license = "MIT OR Apache-2.0" [features] -default = ["serde", "wasm"] +default = ["serde"] nightly = [] type_id_logging = [] -wasm = ["web-sys"] wgpu = ["dep:wgpu"] vello = ["dep:vello", "bezier-rs/kurbo", "wgpu"] dealloc_nodes = [] @@ -47,7 +46,6 @@ base64 = { workspace = true } serde = { workspace = true, optional = true } vello = { workspace = true, optional = true } wgpu = { workspace = true, optional = true } -web-sys = { workspace = true, optional = true } [dev-dependencies] # Workspace dependencies diff --git a/node-graph/gcore/src/graphic_element/renderer.rs b/node-graph/gcore/src/graphic_element/renderer.rs index cc68f0a687..165f5a5ed6 100644 --- a/node-graph/gcore/src/graphic_element/renderer.rs +++ b/node-graph/gcore/src/graphic_element/renderer.rs @@ -299,7 +299,7 @@ impl Default for SvgRender { #[derive(Clone, Debug, Default)] pub struct RenderContext { - #[cfg(feature = "wgpu")] + #[cfg(feature = "vello")] pub resource_overrides: HashMap>, } diff --git a/node-graph/gcore/src/lib.rs b/node-graph/gcore/src/lib.rs index 4af81a6100..68cf13e46b 100644 --- a/node-graph/gcore/src/lib.rs +++ b/node-graph/gcore/src/lib.rs @@ -28,8 +28,6 @@ mod graphic_element; pub use graphic_element::*; pub mod vector; -pub mod application_io; - pub mod registry; pub use context::*; @@ -140,12 +138,6 @@ impl<'i, I, O: 'i> Node<'i, I> for Pin<&'i (dyn NodeIO<'i, I, Output = O> + 'i)> } } -pub use crate::application_io::{SurfaceFrame, SurfaceId}; -#[cfg(feature = "wasm")] -pub type WasmSurfaceHandle = application_io::SurfaceHandle; -#[cfg(feature = "wasm")] -pub type WasmSurfaceHandleFrame = application_io::SurfaceHandleFrame; - pub trait InputAccessorSource<'a, T>: InputAccessorSourceIdentifier + std::fmt::Debug { fn get_input(&'a self, index: usize) -> Option<&'a T>; fn set_input(&'a mut self, index: usize, value: T); diff --git a/node-graph/graph-craft/Cargo.toml b/node-graph/graph-craft/Cargo.toml index 91e800eb6c..963ef97e72 100644 --- a/node-graph/graph-craft/Cargo.toml +++ b/node-graph/graph-craft/Cargo.toml @@ -16,6 +16,7 @@ loading = ["serde_json"] # Local dependencies dyn-any = { workspace = true } graphene-core = { workspace = true } +graphene-application-io = { workspace = true } # Workspace dependencies log = { workspace = true } diff --git a/node-graph/graph-craft/src/document/value.rs b/node-graph/graph-craft/src/document/value.rs index f641555d99..17e1869f86 100644 --- a/node-graph/graph-craft/src/document/value.rs +++ b/node-graph/graph-craft/src/document/value.rs @@ -4,6 +4,7 @@ use crate::wasm_application_io::WasmEditorApi; use dyn_any::DynAny; pub use dyn_any::StaticType; pub use glam::{DAffine2, DVec2, IVec2, UVec2}; +use graphene_application_io::SurfaceFrame; use graphene_core::raster::brush_cache::BrushCache; use graphene_core::raster::{BlendMode, LuminanceCalculation}; use graphene_core::raster_types::CPU; @@ -30,7 +31,7 @@ macro_rules! tagged_value { None, $( $(#[$meta] ) *$identifier( $ty ), )* RenderOutput(RenderOutput), - SurfaceFrame(graphene_core::SurfaceFrame), + SurfaceFrame(SurfaceFrame), #[serde(skip)] EditorApi(Arc) } @@ -76,7 +77,7 @@ macro_rules! tagged_value { Self::None => concrete!(()), $( Self::$identifier(_) => concrete!($ty), )* Self::RenderOutput(_) => concrete!(RenderOutput), - Self::SurfaceFrame(_) => concrete!(graphene_core::SurfaceFrame), + Self::SurfaceFrame(_) => concrete!(SurfaceFrame), Self::EditorApi(_) => concrete!(&WasmEditorApi) } } @@ -89,7 +90,7 @@ macro_rules! tagged_value { x if x == TypeId::of::<()>() => Ok(TaggedValue::None), $( x if x == TypeId::of::<$ty>() => Ok(TaggedValue::$identifier(*downcast(input).unwrap())), )* x if x == TypeId::of::() => Ok(TaggedValue::RenderOutput(*downcast(input).unwrap())), - x if x == TypeId::of::() => Ok(TaggedValue::SurfaceFrame(*downcast(input).unwrap())), + x if x == TypeId::of::() => Ok(TaggedValue::SurfaceFrame(*downcast(input).unwrap())), _ => Err(format!("Cannot convert {:?} to TaggedValue", DynAny::type_name(input.as_ref()))), @@ -103,7 +104,7 @@ macro_rules! tagged_value { x if x == TypeId::of::<()>() => Ok(TaggedValue::None), $( x if x == TypeId::of::<$ty>() => Ok(TaggedValue::$identifier(<$ty as Clone>::clone(input.downcast_ref().unwrap()))), )* x if x == TypeId::of::() => Ok(TaggedValue::RenderOutput(RenderOutput::clone(input.downcast_ref().unwrap()))), - x if x == TypeId::of::() => Ok(TaggedValue::SurfaceFrame(graphene_core::SurfaceFrame::clone(input.downcast_ref().unwrap()))), + x if x == TypeId::of::() => Ok(TaggedValue::SurfaceFrame(SurfaceFrame::clone(input.downcast_ref().unwrap()))), _ => Err(format!("Cannot convert {:?} to TaggedValue",std::any::type_name_of_val(input))), } } @@ -430,7 +431,7 @@ pub struct RenderOutput { #[derive(Debug, Clone, PartialEq, dyn_any::DynAny, Hash, serde::Serialize, serde::Deserialize)] pub enum RenderOutputType { - CanvasFrame(graphene_core::SurfaceFrame), + CanvasFrame(SurfaceFrame), Svg(String), Image(Vec), } diff --git a/node-graph/graph-craft/src/wasm_application_io.rs b/node-graph/graph-craft/src/wasm_application_io.rs index 9ae94267d8..f9657bf098 100644 --- a/node-graph/graph-craft/src/wasm_application_io.rs +++ b/node-graph/graph-craft/src/wasm_application_io.rs @@ -1,5 +1,5 @@ use dyn_any::StaticType; -use graphene_core::application_io::{ApplicationError, ApplicationIo, ResourceFuture, SurfaceHandle, SurfaceId}; +use graphene_application_io::{ApplicationError, ApplicationIo, ResourceFuture, SurfaceHandle, SurfaceId}; #[cfg(target_arch = "wasm32")] use js_sys::{Object, Reflect}; use std::collections::HashMap; @@ -168,7 +168,7 @@ impl<'a> From<&'a WasmApplicationIo> for &'a WgpuExecutor { } } -pub type WasmEditorApi = graphene_core::application_io::EditorApi; +pub type WasmEditorApi = graphene_application_io::EditorApi; impl ApplicationIo for WasmApplicationIo { #[cfg(target_arch = "wasm32")] @@ -208,7 +208,7 @@ impl ApplicationIo for WasmApplicationIo { // Use Reflect API to set property Reflect::set(&canvases, &js_key, &js_value)?; Ok::<_, JsValue>(SurfaceHandle { - window_id: graphene_core::SurfaceId(id), + window_id: SurfaceId(id), surface: canvas, }) }; @@ -313,7 +313,7 @@ impl ApplicationIo for WasmApplicationIo { #[cfg(feature = "wgpu")] pub type WasmSurfaceHandle = SurfaceHandle; #[cfg(feature = "wgpu")] -pub type WasmSurfaceHandleFrame = graphene_core::application_io::SurfaceHandleFrame; +pub type WasmSurfaceHandleFrame = graphene_application_io::SurfaceHandleFrame; #[derive(Clone, Debug, PartialEq, Hash, specta::Type, serde::Serialize, serde::Deserialize)] pub struct EditorPreferences { @@ -321,7 +321,7 @@ pub struct EditorPreferences { pub use_vello: bool, } -impl graphene_core::application_io::GetEditorPreferences for EditorPreferences { +impl graphene_application_io::GetEditorPreferences for EditorPreferences { // fn hostname(&self) -> &str { // &self.imaginate_hostname // } diff --git a/node-graph/graphene-cli/src/main.rs b/node-graph/graphene-cli/src/main.rs index fc60a920d4..aab5ab85c1 100644 --- a/node-graph/graphene-cli/src/main.rs +++ b/node-graph/graphene-cli/src/main.rs @@ -6,8 +6,8 @@ use graph_craft::graphene_compiler::{Compiler, Executor}; use graph_craft::proto::ProtoNetwork; use graph_craft::util::load_network; use graph_craft::wasm_application_io::EditorPreferences; -use graphene_core::application_io::{ApplicationIo, NodeGraphUpdateSender}; use graphene_core::text::FontCache; +use graphene_std::application_io::{ApplicationIo, NodeGraphUpdateMessage, NodeGraphUpdateSender, RenderConfig}; use graphene_std::wasm_application_io::{WasmApplicationIo, WasmEditorApi}; use interpreted_executor::dynamic_executor::DynamicExecutor; use interpreted_executor::util::wrap_network_in_scope; @@ -18,7 +18,7 @@ use std::sync::Arc; struct UpdateLogger {} impl NodeGraphUpdateSender for UpdateLogger { - fn send(&self, message: graphene_core::application_io::NodeGraphUpdateMessage) { + fn send(&self, message: NodeGraphUpdateMessage) { println!("{message:?}"); } } @@ -115,7 +115,7 @@ async fn main() -> Result<(), Box> { } }); let executor = create_executor(proto_graph)?; - let render_config = graphene_core::application_io::RenderConfig::default(); + let render_config = RenderConfig::default(); loop { let result = (&executor).execute(render_config).await?; diff --git a/node-graph/gstd/Cargo.toml b/node-graph/gstd/Cargo.toml index 56e4f9b7ac..6d440e85e5 100644 --- a/node-graph/gstd/Cargo.toml +++ b/node-graph/gstd/Cargo.toml @@ -9,8 +9,8 @@ license = "MIT OR Apache-2.0" [features] default = ["wasm", "imaginate"] gpu = [] -wgpu = ["gpu", "graph-craft/wgpu"] -wasm = ["wasm-bindgen", "web-sys"] +wgpu = ["gpu", "graph-craft/wgpu", "graphene-application-io/wgpu"] +wasm = ["wasm-bindgen", "web-sys", "graphene-application-io/wasm"] imaginate = ["image/png", "base64", "web-sys", "wasm-bindgen-futures"] image-compare = [] vello = ["dep:vello", "gpu", "graphene-core/vello"] @@ -23,6 +23,7 @@ dyn-any = { workspace = true } graph-craft = { workspace = true } wgpu-executor = { workspace = true } graphene-core = { workspace = true } +graphene-application-io = { workspace = true } # Workspace dependencies fastnoise-lite = { workspace = true } diff --git a/node-graph/gstd/src/lib.rs b/node-graph/gstd/src/lib.rs index ef07c3080c..ffc6b99380 100644 --- a/node-graph/gstd/src/lib.rs +++ b/node-graph/gstd/src/lib.rs @@ -10,4 +10,5 @@ pub mod vector; #[cfg(feature = "wasm")] pub mod wasm_application_io; +pub use graphene_application_io as application_io; pub use graphene_core::*; diff --git a/node-graph/gstd/src/wasm_application_io.rs b/node-graph/gstd/src/wasm_application_io.rs index 94cc29b9fc..d3f344555e 100644 --- a/node-graph/gstd/src/wasm_application_io.rs +++ b/node-graph/gstd/src/wasm_application_io.rs @@ -1,9 +1,7 @@ use graph_craft::document::value::RenderOutput; pub use graph_craft::document::value::RenderOutputType; pub use graph_craft::wasm_application_io::*; -#[cfg(target_arch = "wasm32")] -use graphene_core::application_io::SurfaceHandle; -use graphene_core::application_io::{ApplicationIo, ExportFormat, RenderConfig}; +use graphene_application_io::{ApplicationIo, ExportFormat, RenderConfig}; #[cfg(target_arch = "wasm32")] use graphene_core::instances::Instances; #[cfg(target_arch = "wasm32")] @@ -127,7 +125,7 @@ async fn render_canvas( surface_handle: wgpu_executor::WgpuSurface, render_params: RenderParams, ) -> RenderOutputType { - use graphene_core::SurfaceFrame; + use graphene_application_io::SurfaceFrame; let footprint = render_config.viewport; let Some(exec) = editor.application_io.as_ref().unwrap().gpu_executor() else { @@ -172,7 +170,7 @@ async fn rasterize( )] mut data: Instances, footprint: Footprint, - surface_handle: Arc>, + surface_handle: Arc>, ) -> RasterDataTable where Instances: GraphicElementRendered, diff --git a/node-graph/interpreted-executor/src/node_registry.rs b/node-graph/interpreted-executor/src/node_registry.rs index 6059e24e6e..2c232e1835 100644 --- a/node-graph/interpreted-executor/src/node_registry.rs +++ b/node-graph/interpreted-executor/src/node_registry.rs @@ -13,7 +13,7 @@ use graphene_core::{fn_type_fut, future}; use graphene_std::Context; use graphene_std::GraphicElement; use graphene_std::any::{ComposeTypeErased, DowncastBothNode, DynAnyNode, IntoTypeErasedNode}; -use graphene_std::application_io::ImageTexture; +use graphene_std::application_io::{ImageTexture, SurfaceFrame}; use graphene_std::wasm_application_io::*; use node_registry_macros::{async_node, into_node}; use once_cell::sync::Lazy; @@ -80,8 +80,8 @@ fn node_registry() -> HashMap, input: Context, fn_params: [Context => WindowHandle]), async_node!(graphene_core::memo::MemoNode<_, _>, input: Context, fn_params: [Context => Option]), async_node!(graphene_core::memo::MemoNode<_, _>, input: Context, fn_params: [Context => WindowHandle]), - async_node!(graphene_core::memo::MemoNode<_, _>, input: Context, fn_params: [Context => graphene_std::SurfaceFrame]), - async_node!(graphene_core::memo::MemoNode<_, _>, input: UVec2, fn_params: [UVec2 => graphene_std::SurfaceFrame]), + async_node!(graphene_core::memo::MemoNode<_, _>, input: Context, fn_params: [Context => SurfaceFrame]), + async_node!(graphene_core::memo::MemoNode<_, _>, input: UVec2, fn_params: [UVec2 => SurfaceFrame]), async_node!(graphene_core::memo::MemoNode<_, _>, input: Context, fn_params: [Context => f64]), async_node!(graphene_core::memo::MemoNode<_, _>, input: Context, fn_params: [Context => String]), async_node!(graphene_core::memo::MemoNode<_, _>, input: Context, fn_params: [Context => RenderOutput]), diff --git a/node-graph/wgpu-executor/Cargo.toml b/node-graph/wgpu-executor/Cargo.toml index 6480c056aa..7eb1c31a8f 100644 --- a/node-graph/wgpu-executor/Cargo.toml +++ b/node-graph/wgpu-executor/Cargo.toml @@ -11,7 +11,8 @@ passthrough = [] [dependencies] # Local dependencies -graphene-core = { workspace = true, features = ["wgpu"] } +graphene-core = { workspace = true, features = ["wgpu", "vello"] } +graphene-application-io = { workspace = true, features = ["wgpu"] } dyn-any = { workspace = true } node-macro = { workspace = true } diff --git a/node-graph/wgpu-executor/src/lib.rs b/node-graph/wgpu-executor/src/lib.rs index a37df118a1..948cfd5d1b 100644 --- a/node-graph/wgpu-executor/src/lib.rs +++ b/node-graph/wgpu-executor/src/lib.rs @@ -4,7 +4,7 @@ use anyhow::Result; pub use context::Context; use dyn_any::StaticType; use glam::UVec2; -use graphene_core::application_io::{ApplicationIo, EditorApi, SurfaceHandle}; +use graphene_application_io::{ApplicationIo, EditorApi, SurfaceHandle}; use graphene_core::{Color, Ctx}; use std::sync::Arc; use vello::{AaConfig, AaSupport, RenderParams, Renderer, RendererOptions, Scene}; @@ -31,7 +31,7 @@ impl<'a, T: ApplicationIo> From<&'a EditorApi> for & pub type WgpuSurface = Arc>; pub type WgpuWindow = Arc>; -impl graphene_core::application_io::Size for Surface { +impl graphene_application_io::Size for Surface { fn size(&self) -> UVec2 { self.resolution } @@ -104,7 +104,7 @@ impl WgpuExecutor { } #[cfg(target_arch = "wasm32")] - pub fn create_surface(&self, canvas: graphene_core::WasmSurfaceHandle) -> Result> { + pub fn create_surface(&self, canvas: graphene_application_io::WasmSurfaceHandle) -> Result> { let surface = self.context.instance.create_surface(wgpu::SurfaceTarget::Canvas(canvas.surface))?; Ok(SurfaceHandle { From 2d62d01fd435e847444ea67023e7c611da33ee80 Mon Sep 17 00:00:00 2001 From: Firestar99 Date: Mon, 23 Jun 2025 12:30:41 +0200 Subject: [PATCH 13/44] Make `wasm` only depend on `gstd`, not `gcore` (#2745) make `wasm` only depend on `gstd`, not `gcore` --- Cargo.lock | 2 +- frontend/wasm/Cargo.toml | 2 +- frontend/wasm/src/editor_api.rs | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9a3c0711b8..e98a3270c5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2313,7 +2313,7 @@ version = "0.0.0" dependencies = [ "glam", "graph-craft", - "graphene-core", + "graphene-std", "graphite-editor", "js-sys", "log", diff --git a/frontend/wasm/Cargo.toml b/frontend/wasm/Cargo.toml index 44ac26c2da..b97b2f771c 100644 --- a/frontend/wasm/Cargo.toml +++ b/frontend/wasm/Cargo.toml @@ -25,11 +25,11 @@ editor = { path = "../../editor", package = "graphite-editor", features = [ "resvg", "vello", ] } +graphene-std = { workspace = true } # Workspace dependencies graph-craft = { workspace = true } log = { workspace = true } -graphene-core = { workspace = true } serde = { workspace = true } wasm-bindgen = { workspace = true } serde-wasm-bindgen = { workspace = true } diff --git a/frontend/wasm/src/editor_api.rs b/frontend/wasm/src/editor_api.rs index 7284cc3fce..88bc85bc3a 100644 --- a/frontend/wasm/src/editor_api.rs +++ b/frontend/wasm/src/editor_api.rs @@ -16,7 +16,7 @@ use editor::messages::portfolio::utility_types::Platform; use editor::messages::prelude::*; use editor::messages::tool::tool_messages::tool_prelude::WidgetId; use graph_craft::document::NodeId; -use graphene_core::raster::color::Color; +use graphene_std::raster::color::Color; use serde::Serialize; use serde_wasm_bindgen::{self, from_value}; use std::cell::RefCell; @@ -627,7 +627,7 @@ impl EditorHandle { insert_index: Option, ) { let mouse = mouse_x.and_then(|x| mouse_y.map(|y| (x, y))); - let image = graphene_core::raster::Image::from_image_data(&image_data, width, height); + let image = graphene_std::raster::Image::from_image_data(&image_data, width, height); let parent_and_insert_index = if let (Some(insert_parent_id), Some(insert_index)) = (insert_parent_id, insert_index) { let insert_parent_id = NodeId(insert_parent_id); @@ -758,7 +758,7 @@ impl EditorHandle { use graph_craft::document::DocumentNodeImplementation; use graph_craft::document::NodeInput; use graph_craft::document::value::TaggedValue; - use graphene_core::vector::*; + use graphene_std::vector::*; let (_, request_receiver) = std::sync::mpsc::channel(); let (response_sender, _) = std::sync::mpsc::channel(); From 59bb3194ca7e15e872f22a7167572f8b20d341e2 Mon Sep 17 00:00:00 2001 From: Keavon Chambers Date: Mon, 23 Jun 2025 03:55:32 -0700 Subject: [PATCH 14/44] Fix website donation page to work with responsive design --- ...view-2024-highlights-and-a-peek-at-2025.md | 18 +++++++++-- website/content/donate.md | 17 +++++------ website/sass/component/feature-icons.scss | 9 ++++++ website/sass/page/donate.scss | 30 ++++++++++++++++++- 4 files changed, 60 insertions(+), 14 deletions(-) diff --git a/website/content/blog/2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025.md b/website/content/blog/2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025.md index c2376abf5f..f34dc883d6 100644 --- a/website/content/blog/2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025.md +++ b/website/content/blog/2025-01-16-year-in-review-2024-highlights-and-a-peek-at-2025.md @@ -23,9 +23,21 @@ In a world where the notion of software ownership seems headed towards extinctio Graphite is and will always remain yours to keep, whether that's by running the lightweight, client-side [web app](https://editor.graphite.rs) (no signup, no cloud), installing the PWA on your desktop, self-hosting the builds, or downloading the soon-to-be-ready native app for your OS of choice (more news on that later in the post). -| | | -|-|-| -|

Join me—Keavon Chambers, founder and designer of Graphite—to see where the past year has brought us on this quest. And let me take this moment to thank our growing community for sharing my vision and showing support, both [financially](/donate) and by boosting the GitHub project page over the 10,000 star milestone just in time to celebrate the end of a productive 2024.

| Screenshot of 10,000 stars | + + +

+Screenshot of 10,000 stars +Join me, founder and designer of Graphite, to see where the past year has brought us on this quest. And let me take this moment to thank our growing community for sharing my vision and showing support, both financially and by boosting the GitHub project page over the 10,000 star milestone just in time to celebrate the end of a productive 2024. +

## 2024 development progress report diff --git a/website/content/donate.md b/website/content/donate.md index b1153494fe..c1eef60bec 100644 --- a/website/content/donate.md +++ b/website/content/donate.md @@ -12,7 +12,7 @@ css = ["/page/donate.css", "/component/feature-box.css", "/component/feature-ico **Own your tools. Own your art.** Invest in the sustainable, independent future of high-quality creative software that's free, and always will be. -

+

Donate: GitHub Sponsors @@ -24,9 +24,9 @@ css = ["/page/donate.css", "/component/feature-box.css", "/component/feature-ico Start to finish in several seconds -

+
-
+
@@ -117,9 +117,6 @@ A small fee of 3.6% + 30¢ reduces what we receive each month. If convenient, co -
- -
+
-Or make a one-time donation +Or make a one-time donation [Manage your ongoing membership](https://billing.stripe.com/p/login/aEU9EzctSfe3cfK5kk) @@ -213,9 +210,9 @@ Also available to individuals wanting to make a larger impact. [Reach out](/cont
-
+
-Or make a one-time donation +Or make a one-time donation [Manage your ongoing membership](https://billing.stripe.com/p/login/aEU9EzctSfe3cfK5kk) diff --git a/website/sass/component/feature-icons.scss b/website/sass/component/feature-icons.scss index 2fc8edba1a..5b99271d94 100644 --- a/website/sass/component/feature-icons.scss +++ b/website/sass/component/feature-icons.scss @@ -55,6 +55,15 @@ } } + &.three-wide .feature-icon { + flex: 1 0 calc((100% / 3) - (16px * 4) - (16px / 4)); + + @media screen and (max-width: 800px) { + // Quarter width, minus own padding on both sides + flex: 1 0 calc(100% - (16px * 2)); + } + } + &.stacked { justify-content: space-between; margin: 0 -10px; diff --git a/website/sass/page/donate.scss b/website/sass/page/donate.scss index d85c67f706..e4f0e78863 100644 --- a/website/sass/page/donate.scss +++ b/website/sass/page/donate.scss @@ -3,7 +3,7 @@ flex-wrap: wrap; flex-direction: row; gap: calc(var(--font-size-link) * 0.8); - margin-top: calc(40 * var(--variable-px)); + margin: calc(40 * var(--variable-px)) 0; span { display: flex; @@ -30,6 +30,10 @@ .triptych { gap: 10px; margin-top: 10px; + + a { + flex-basis: calc(100% / 3 - 10px - (var(--feature-box-padding) * var(--variable-px))); + } } .triptych + .block, @@ -44,6 +48,30 @@ justify-content: space-between; } + .action-buttons { + gap: calc(var(--feature-box-padding) / 4 * var(--variable-px)) calc(var(--feature-box-padding) * var(--variable-px)); + flex-wrap: wrap; + + p { + text-align: left; + text-justify: auto; + white-space: nowrap; + } + } + + @media screen and (max-width: 1280px) { + .triptych a { + // Half width, minus own padding on both sides, minus the gap + flex-basis: calc(50% - (var(--feature-box-padding) * var(--variable-px)) - 10px); + } + } + + @media screen and (max-width: 640px) { + .triptych a { + flex-basis: 100%; + } + } + .feature-box-narrow { min-width: 0; background-color: var(--color-fog); From 2ec0ff38f3b39a01fd7fe822b7bfcaea9b0eb84f Mon Sep 17 00:00:00 2001 From: Ezbaze <68749104+Ezbaze@users.noreply.github.com> Date: Tue, 24 Jun 2025 02:51:16 +0100 Subject: [PATCH 15/44] Improve node creation menu and categorization (#2719) * Change node categories Signed-off-by: ezbaze * Restore Ezbaze's other work that was lost in the rebase --------- Signed-off-by: ezbaze Co-authored-by: Keavon Chambers --- .../portfolio/document/node_graph/node_properties.rs | 10 +++++----- .../src/components/floating-menus/NodeCatalog.svelte | 1 + node-graph/gcore/src/logic.rs | 2 +- node-graph/gcore/src/vector/generator_nodes.rs | 2 +- node-graph/gcore/src/vector/vector_nodes.rs | 6 +++--- 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/editor/src/messages/portfolio/document/node_graph/node_properties.rs b/editor/src/messages/portfolio/document/node_graph/node_properties.rs index 1f6a797fd5..4b4b946982 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_properties.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_properties.rs @@ -1211,16 +1211,16 @@ pub(crate) fn grid_properties(node_id: NodeId, context: &mut NodePropertiesConte } } - let rows = number_widget( - ParameterWidgetsInfo::from_index(document_node, node_id, RowsInput::INDEX, true, context), - NumberInput::default().min(1.), - ); let columns = number_widget( ParameterWidgetsInfo::from_index(document_node, node_id, ColumnsInput::INDEX, true, context), NumberInput::default().min(1.), ); + let rows = number_widget( + ParameterWidgetsInfo::from_index(document_node, node_id, RowsInput::INDEX, true, context), + NumberInput::default().min(1.), + ); - widgets.extend([LayoutGroup::Row { widgets: rows }, LayoutGroup::Row { widgets: columns }]); + widgets.extend([LayoutGroup::Row { widgets: columns }, LayoutGroup::Row { widgets: rows }]); widgets } diff --git a/frontend/src/components/floating-menus/NodeCatalog.svelte b/frontend/src/components/floating-menus/NodeCatalog.svelte index 60aefbbe97..a0f2cbe241 100644 --- a/frontend/src/components/floating-menus/NodeCatalog.svelte +++ b/frontend/src/components/floating-menus/NodeCatalog.svelte @@ -164,6 +164,7 @@ .text-label { padding-left: 16px; position: relative; + pointer-events: none; &::before { content: ""; diff --git a/node-graph/gcore/src/logic.rs b/node-graph/gcore/src/logic.rs index fb009bda68..727e3d0b8b 100644 --- a/node-graph/gcore/src/logic.rs +++ b/node-graph/gcore/src/logic.rs @@ -37,7 +37,7 @@ fn string_length(_: impl Ctx, #[implementations(String)] string: String) -> usiz string.len() } -#[node_macro::node(category("Text"))] +#[node_macro::node(category("Math: Logic"))] async fn switch( #[implementations(Context)] ctx: C, condition: bool, diff --git a/node-graph/gcore/src/vector/generator_nodes.rs b/node-graph/gcore/src/vector/generator_nodes.rs index 2959698d89..75cdec10e2 100644 --- a/node-graph/gcore/src/vector/generator_nodes.rs +++ b/node-graph/gcore/src/vector/generator_nodes.rs @@ -158,8 +158,8 @@ fn grid( #[implementations(f64, DVec2)] spacing: T, #[default(30., 30.)] angles: DVec2, - #[default(10)] rows: u32, #[default(10)] columns: u32, + #[default(10)] rows: u32, ) -> VectorDataTable { let (x_spacing, y_spacing) = spacing.as_dvec2().into(); let (angle_a, angle_b) = angles.into(); diff --git a/node-graph/gcore/src/vector/vector_nodes.rs b/node-graph/gcore/src/vector/vector_nodes.rs index c8030b8f48..c3667c97cc 100644 --- a/node-graph/gcore/src/vector/vector_nodes.rs +++ b/node-graph/gcore/src/vector/vector_nodes.rs @@ -210,7 +210,7 @@ where vector_data } -#[node_macro::node(category("Vector"), path(graphene_core::vector))] +#[node_macro::node(category("Instancing"), path(graphene_core::vector))] async fn repeat( _: impl Ctx, // TODO: Implement other GraphicElementRendered types. @@ -249,7 +249,7 @@ where result_table } -#[node_macro::node(category("Vector"), path(graphene_core::vector))] +#[node_macro::node(category("Instancing"), path(graphene_core::vector))] async fn circular_repeat( _: impl Ctx, // TODO: Implement other GraphicElementRendered types. @@ -284,7 +284,7 @@ where result_table } -#[node_macro::node(name("Copy to Points"), category("Vector"), path(graphene_core::vector))] +#[node_macro::node(name("Copy to Points"), category("Instancing"), path(graphene_core::vector))] async fn copy_to_points( _: impl Ctx, points: VectorDataTable, From fdb09e334b46b74f14dab46f07bd3ad8b1583969 Mon Sep 17 00:00:00 2001 From: Keavon Chambers Date: Mon, 23 Jun 2025 18:52:05 -0700 Subject: [PATCH 16/44] Improve the categorization across many nodes --- .../node_graph/document_node_definitions.rs | 10 ++--- node-graph/gcore/src/graphic_element.rs | 2 +- node-graph/gcore/src/ops.rs | 11 +---- node-graph/gcore/src/raster/adjustments.rs | 4 +- node-graph/gcore/src/vector/vector_nodes.rs | 44 +++++++++---------- node-graph/gstd/src/brush.rs | 6 --- node-graph/gstd/src/dehaze.rs | 2 +- node-graph/gstd/src/http.rs | 4 +- node-graph/gstd/src/image_color_palette.rs | 2 +- node-graph/gstd/src/raster.rs | 6 +-- node-graph/gstd/src/wasm_application_io.rs | 4 +- 11 files changed, 41 insertions(+), 54 deletions(-) diff --git a/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs b/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs index 239e4e894e..af8f6bd130 100644 --- a/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs +++ b/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs @@ -467,7 +467,7 @@ fn static_nodes() -> Vec { }, DocumentNodeDefinition { identifier: "Load Image", - category: "Network", + category: "Web Request", node_template: NodeTemplate { document_node: DocumentNode { implementation: DocumentNodeImplementation::Network(NodeNetwork { @@ -784,7 +784,7 @@ fn static_nodes() -> Vec { }, DocumentNodeDefinition { identifier: "Noise Pattern", - category: "Raster", + category: "Raster: Pattern", node_template: NodeTemplate { document_node: DocumentNode { manual_composition: Some(concrete!(Context)), @@ -837,7 +837,7 @@ fn static_nodes() -> Vec { }, DocumentNodeDefinition { identifier: "Split Channels", - category: "Raster", + category: "Raster: Channels", node_template: NodeTemplate { document_node: DocumentNode { implementation: DocumentNodeImplementation::Network(NodeNetwork { @@ -1823,7 +1823,7 @@ fn static_nodes() -> Vec { }, DocumentNodeDefinition { identifier: "Sample Points", - category: "Vector", + category: "Vector: Modifier", node_template: NodeTemplate { document_node: DocumentNode { implementation: DocumentNodeImplementation::Network(NodeNetwork { @@ -1975,7 +1975,7 @@ fn static_nodes() -> Vec { }, DocumentNodeDefinition { identifier: "Scatter Points", - category: "Vector", + category: "Vector: Modifier", node_template: NodeTemplate { document_node: DocumentNode { implementation: DocumentNodeImplementation::Network(NodeNetwork { diff --git a/node-graph/gcore/src/graphic_element.rs b/node-graph/gcore/src/graphic_element.rs index 1c77b7fd61..44fb22c1de 100644 --- a/node-graph/gcore/src/graphic_element.rs +++ b/node-graph/gcore/src/graphic_element.rs @@ -421,7 +421,7 @@ async fn flatten_group(_: impl Ctx, group: GraphicGroupTable, fully_flatten: boo output } -#[node_macro::node(category("General"))] +#[node_macro::node(category("Vector"))] async fn flatten_vector(_: impl Ctx, group: GraphicGroupTable) -> VectorDataTable { // TODO: Avoid mutable reference, instead return a new GraphicGroupTable? fn flatten_group(output_group_table: &mut VectorDataTable, current_group_table: GraphicGroupTable) { diff --git a/node-graph/gcore/src/ops.rs b/node-graph/gcore/src/ops.rs index f9028059aa..191feda247 100644 --- a/node-graph/gcore/src/ops.rs +++ b/node-graph/gcore/src/ops.rs @@ -1,5 +1,4 @@ use crate::Ctx; -use crate::raster::BlendMode; use crate::raster_types::{CPU, RasterDataTable}; use crate::registry::types::{Fraction, Percentage}; use crate::vector::style::GradientStops; @@ -34,7 +33,7 @@ impl ValueProvider for MathNodeContext { } /// Calculates a mathematical expression with input values "A" and "B" -#[node_macro::node(category("General"), properties("math_properties"))] +#[node_macro::node(category("Math: Arithmetic"), properties("math_properties"))] fn math( _: impl Ctx, /// The value of "A" when calculating the expression @@ -467,7 +466,7 @@ fn color_value(_: impl Ctx, _primary: (), #[default(Color::BLACK)] color: Option // } /// Gets the color at the specified position along the gradient, given a position from 0 (left) to 1 (right). -#[node_macro::node(category("General"))] +#[node_macro::node(category("Color"))] fn sample_gradient(_: impl Ctx, _primary: (), gradient: GradientStops, position: Fraction) -> Color { let position = position.clamp(0., 1.); gradient.evaluate(position) @@ -479,12 +478,6 @@ fn gradient_value(_: impl Ctx, _primary: (), gradient: GradientStops) -> Gradien gradient } -/// Constructs a blend mode choice value which may be set to any of the available blend modes in order to tell another node which blending operation to use. -#[node_macro::node(category("Value"))] -fn blend_mode_value(_: impl Ctx, _primary: (), blend_mode: BlendMode) -> BlendMode { - blend_mode -} - /// Constructs a string value which may be set to any plain text. #[node_macro::node(category("Value"))] fn string_value(_: impl Ctx, _primary: (), string: String) -> String { diff --git a/node-graph/gcore/src/raster/adjustments.rs b/node-graph/gcore/src/raster/adjustments.rs index 2d952a4292..a39caa81c8 100644 --- a/node-graph/gcore/src/raster/adjustments.rs +++ b/node-graph/gcore/src/raster/adjustments.rs @@ -276,7 +276,7 @@ fn luminance>( input } -#[node_macro::node(category("Raster"))] +#[node_macro::node(category("Raster: Channels"))] fn extract_channel>( _: impl Ctx, #[implementations( @@ -299,7 +299,7 @@ fn extract_channel>( input } -#[node_macro::node(category("Raster"))] +#[node_macro::node(category("Raster: Channels"))] fn make_opaque>( _: impl Ctx, #[implementations( diff --git a/node-graph/gcore/src/vector/vector_nodes.rs b/node-graph/gcore/src/vector/vector_nodes.rs index c3667c97cc..563cb5e12e 100644 --- a/node-graph/gcore/src/vector/vector_nodes.rs +++ b/node-graph/gcore/src/vector/vector_nodes.rs @@ -366,7 +366,7 @@ where result_table } -#[node_macro::node(category("Vector"), path(graphene_core::vector))] +#[node_macro::node(category("Instancing"), path(graphene_core::vector))] async fn mirror( _: impl Ctx, #[implementations(GraphicGroupTable, VectorDataTable, RasterDataTable)] instance: Instances, @@ -424,7 +424,7 @@ where result_table } -#[node_macro::node(category("Vector"), path(graphene_core::vector))] +#[node_macro::node(category("Vector: Modifier"), path(graphene_core::vector))] async fn round_corners( _: impl Ctx, source: VectorDataTable, @@ -549,7 +549,7 @@ async fn round_corners( result_table } -#[node_macro::node(name("Merge by Distance"), category("Vector"), path(graphene_core::vector))] +#[node_macro::node(name("Merge by Distance"), category("Vector: Modifier"), path(graphene_core::vector))] pub fn merge_by_distance( _: impl Ctx, vector_data: VectorDataTable, @@ -694,7 +694,7 @@ pub fn merge_by_distance( result_table } -#[node_macro::node(category("Debug"), path(graphene_core::vector))] +#[node_macro::node(category("Vector: Modifier"), path(graphene_core::vector))] async fn box_warp(_: impl Ctx, vector_data: VectorDataTable, #[expose] rectangle: VectorDataTable) -> VectorDataTable { let Some((target, target_transform)) = rectangle.get(0).map(|rect| (rect.instance, rect.transform)) else { return vector_data; @@ -783,7 +783,7 @@ fn bilinear_interpolate(t: DVec2, quad: &[DVec2; 4]) -> DVec2 { } /// Automatically constructs tangents (Bézier handles) for anchor points in a vector path. -#[node_macro::node(category("Vector"), name("Auto-Tangents"), path(graphene_core::vector))] +#[node_macro::node(category("Vector: Modifier"), name("Auto-Tangents"), path(graphene_core::vector))] async fn auto_tangents( _: impl Ctx, source: VectorDataTable, @@ -1018,7 +1018,7 @@ async fn auto_tangents( // result_table // } -#[node_macro::node(category("Vector"), path(graphene_core::vector))] +#[node_macro::node(category("Vector: Modifier"), path(graphene_core::vector))] async fn bounding_box(_: impl Ctx, vector_data: VectorDataTable) -> VectorDataTable { let mut result_table = VectorDataTable::default(); @@ -1045,7 +1045,7 @@ async fn bounding_box(_: impl Ctx, vector_data: VectorDataTable) -> VectorDataTa result_table } -#[node_macro::node(category("Vector"), path(graphene_core::vector))] +#[node_macro::node(category("Vector: Measure"), path(graphene_core::vector))] async fn dimensions(_: impl Ctx, vector_data: VectorDataTable) -> DVec2 { vector_data .instance_ref_iter() @@ -1102,7 +1102,7 @@ async fn points_to_polyline(_: impl Ctx, mut points: VectorDataTable, #[default( points } -#[node_macro::node(category("Vector"), path(graphene_core::vector), properties("offset_path_properties"))] +#[node_macro::node(category("Vector: Modifier"), path(graphene_core::vector), properties("offset_path_properties"))] async fn offset_path(_: impl Ctx, vector_data: VectorDataTable, distance: f64, join: StrokeJoin, #[default(4.)] miter_limit: f64) -> VectorDataTable { let mut result_table = VectorDataTable::default(); @@ -1146,7 +1146,7 @@ async fn offset_path(_: impl Ctx, vector_data: VectorDataTable, distance: f64, j result_table } -#[node_macro::node(category("Vector"), path(graphene_core::vector))] +#[node_macro::node(category("Vector: Modifier"), path(graphene_core::vector))] async fn solidify_stroke(_: impl Ctx, vector_data: VectorDataTable) -> VectorDataTable { let mut result_table = VectorDataTable::default(); @@ -1314,7 +1314,7 @@ async fn sample_points(_: impl Ctx, vector_data: VectorDataTable, spacing: f64, result_table } -#[node_macro::node(category("Vector"), path(graphene_core::vector))] +#[node_macro::node(category("Vector: Modifier"), path(graphene_core::vector))] async fn split_path(_: impl Ctx, mut vector_data: VectorDataTable, t_value: f64, parameterized_distance: bool, reverse: bool) -> VectorDataTable { let euclidian = !parameterized_distance; @@ -1355,7 +1355,7 @@ async fn split_path(_: impl Ctx, mut vector_data: VectorDataTable, t_value: f64, /// Determines the position of a point on the path, given by its progress from 0 to 1 along the path. /// If multiple subpaths make up the path, the whole number part of the progress value selects the subpath and the decimal part determines the position along it. -#[node_macro::node(name("Position on Path"), category("Vector"), path(graphene_core::vector))] +#[node_macro::node(name("Position on Path"), category("Vector: Measure"), path(graphene_core::vector))] async fn position_on_path( _: impl Ctx, /// The path to traverse. @@ -1391,7 +1391,7 @@ async fn position_on_path( /// Determines the angle of the tangent at a point on the path, given by its progress from 0 to 1 along the path. /// If multiple subpaths make up the path, the whole number part of the progress value selects the subpath and the decimal part determines the position along it. -#[node_macro::node(name("Tangent on Path"), category("Vector"), path(graphene_core::vector))] +#[node_macro::node(name("Tangent on Path"), category("Vector: Measure"), path(graphene_core::vector))] async fn tangent_on_path( _: impl Ctx, /// The path to traverse. @@ -1509,7 +1509,7 @@ async fn subpath_segment_lengths(_: impl Ctx, vector_data: VectorDataTable) -> V .collect() } -#[node_macro::node(name("Spline"), category("Vector"), path(graphene_core::vector))] +#[node_macro::node(name("Spline"), category("Vector: Modifier"), path(graphene_core::vector))] async fn spline(_: impl Ctx, vector_data: VectorDataTable) -> VectorDataTable { let mut result_table = VectorDataTable::default(); @@ -1555,7 +1555,7 @@ async fn spline(_: impl Ctx, vector_data: VectorDataTable) -> VectorDataTable { result_table } -#[node_macro::node(category("Vector"), path(graphene_core::vector))] +#[node_macro::node(category("Vector: Modifier"), path(graphene_core::vector))] async fn jitter_points(_: impl Ctx, vector_data: VectorDataTable, #[default(5.)] amount: f64, seed: SeedValue) -> VectorDataTable { let mut result_table = VectorDataTable::default(); @@ -1608,7 +1608,7 @@ async fn jitter_points(_: impl Ctx, vector_data: VectorDataTable, #[default(5.)] result_table } -#[node_macro::node(category("Vector"), path(graphene_core::vector))] +#[node_macro::node(category("Vector: Modifier"), path(graphene_core::vector))] async fn morph(_: impl Ctx, source: VectorDataTable, #[expose] target: VectorDataTable, #[default(0.5)] time: Fraction) -> VectorDataTable { /// Subdivides the last segment of the bezpath to until it appends 'count' number of segments. fn make_new_segments(bezpath: &mut BezPath, count: usize) { @@ -1878,7 +1878,7 @@ fn bevel_algorithm(mut vector_data: VectorData, vector_data_transform: DAffine2, vector_data } -#[node_macro::node(category("Vector"), path(graphene_core::vector))] +#[node_macro::node(category("Vector: Modifier"), path(graphene_core::vector))] fn bevel(_: impl Ctx, source: VectorDataTable, #[default(10.)] distance: Length) -> VectorDataTable { let mut result_table = VectorDataTable::default(); @@ -1892,7 +1892,7 @@ fn bevel(_: impl Ctx, source: VectorDataTable, #[default(10.)] distance: Length) result_table } -#[node_macro::node(category("Vector"), path(graphene_core::vector))] +#[node_macro::node(category("Vector: Modifier"), path(graphene_core::vector))] fn close_path(_: impl Ctx, source: VectorDataTable) -> VectorDataTable { let mut result_table = VectorDataTable::default(); @@ -1904,17 +1904,17 @@ fn close_path(_: impl Ctx, source: VectorDataTable) -> VectorDataTable { result_table } -#[node_macro::node(category("Vector"), path(graphene_core::vector))] +#[node_macro::node(category("Vector: Measure"), path(graphene_core::vector))] fn point_inside(_: impl Ctx, source: VectorDataTable, point: DVec2) -> bool { source.instance_iter().any(|instance| instance.instance.check_point_inside_shape(instance.transform, point)) } -#[node_macro::node(category("Vector"), path(graphene_core::vector))] +#[node_macro::node(category("General"), path(graphene_core::vector))] async fn count_elements(_: impl Ctx, #[implementations(GraphicGroupTable, VectorDataTable, RasterDataTable, RasterDataTable)] source: Instances) -> u64 { source.instance_iter().count() as u64 } -#[node_macro::node(category("Vector"), path(graphene_core::vector))] +#[node_macro::node(category("Vector: Measure"), path(graphene_core::vector))] async fn path_length(_: impl Ctx, source: VectorDataTable) -> f64 { source .instance_iter() @@ -1932,7 +1932,7 @@ async fn path_length(_: impl Ctx, source: VectorDataTable) -> f64 { .sum() } -#[node_macro::node(category("Vector"), path(graphene_core::vector))] +#[node_macro::node(category("Vector: Measure"), path(graphene_core::vector))] async fn area(ctx: impl Ctx + CloneVarArgs + ExtractAll, vector_data: impl Node, Output = VectorDataTable>) -> f64 { let new_ctx = OwnedContextImpl::from(ctx).with_footprint(Footprint::default()).into_context(); let vector_data = vector_data.eval(new_ctx).await; @@ -1946,7 +1946,7 @@ async fn area(ctx: impl Ctx + CloneVarArgs + ExtractAll, vector_data: impl Node< .sum() } -#[node_macro::node(category("Vector"), path(graphene_core::vector))] +#[node_macro::node(category("Vector: Measure"), path(graphene_core::vector))] async fn centroid(ctx: impl Ctx + CloneVarArgs + ExtractAll, vector_data: impl Node, Output = VectorDataTable>, centroid_type: CentroidType) -> DVec2 { let new_ctx = OwnedContextImpl::from(ctx).with_footprint(Footprint::default()).into_context(); let vector_data = vector_data.eval(new_ctx).await; diff --git a/node-graph/gstd/src/brush.rs b/node-graph/gstd/src/brush.rs index 145766075c..ed4cbb1685 100644 --- a/node-graph/gstd/src/brush.rs +++ b/node-graph/gstd/src/brush.rs @@ -12,15 +12,9 @@ use graphene_core::raster_types::{CPU, Raster, RasterDataTable}; use graphene_core::renderer::GraphicElementRendered; use graphene_core::transform::Transform; use graphene_core::value::ClonedNode; -use graphene_core::vector::VectorDataTable; use graphene_core::vector::brush_stroke::{BrushStroke, BrushStyle}; use graphene_core::{Ctx, GraphicElement, Node}; -#[node_macro::node(category("Debug"))] -fn vector_points(_: impl Ctx, vector_data: VectorDataTable) -> Vec { - vector_data.instance_iter().flat_map(|element| element.instance.point_domain.positions().to_vec()).collect() -} - #[derive(Clone, Copy, Debug, PartialEq)] pub struct BrushStampGenerator { color: P, diff --git a/node-graph/gstd/src/dehaze.rs b/node-graph/gstd/src/dehaze.rs index c927b31da4..d85e679f4e 100644 --- a/node-graph/gstd/src/dehaze.rs +++ b/node-graph/gstd/src/dehaze.rs @@ -6,7 +6,7 @@ use image::{DynamicImage, GenericImage, GenericImageView, GrayImage, ImageBuffer use ndarray::{Array2, ArrayBase, Dim, OwnedRepr}; use std::cmp::{max, min}; -#[node_macro::node(category("Raster"))] +#[node_macro::node(category("Raster: Filter"))] async fn dehaze(_: impl Ctx, image_frame: RasterDataTable, strength: Percentage) -> RasterDataTable { let mut result_table = RasterDataTable::default(); diff --git a/node-graph/gstd/src/http.rs b/node-graph/gstd/src/http.rs index a90af0ba97..bd3e77ab3a 100644 --- a/node-graph/gstd/src/http.rs +++ b/node-graph/gstd/src/http.rs @@ -1,11 +1,11 @@ use graphene_core::Ctx; -#[node_macro::node(category("Network"))] +#[node_macro::node(category("Web Request"))] async fn get_request(_: impl Ctx, url: String) -> reqwest::Response { reqwest::get(url).await.unwrap() } -#[node_macro::node(category("Network"))] +#[node_macro::node(category("Web Request"))] async fn post_request(_: impl Ctx, url: String, body: String) -> reqwest::Response { reqwest::Client::new().post(url).body(body).send().await.unwrap() } diff --git a/node-graph/gstd/src/image_color_palette.rs b/node-graph/gstd/src/image_color_palette.rs index 6ed548f0ff..c513061527 100644 --- a/node-graph/gstd/src/image_color_palette.rs +++ b/node-graph/gstd/src/image_color_palette.rs @@ -1,7 +1,7 @@ use graphene_core::raster_types::{CPU, RasterDataTable}; use graphene_core::{Color, Ctx}; -#[node_macro::node(category("Raster"))] +#[node_macro::node(category("Color"))] async fn image_color_palette( _: impl Ctx, image: RasterDataTable, diff --git a/node-graph/gstd/src/raster.rs b/node-graph/gstd/src/raster.rs index d6294d14f9..94c045dfe5 100644 --- a/node-graph/gstd/src/raster.rs +++ b/node-graph/gstd/src/raster.rs @@ -91,7 +91,7 @@ fn sample_image(ctx: impl ExtractFootprint + Clone + Send, image_frame: RasterDa result_table } -#[node_macro::node(category("Raster"))] +#[node_macro::node(category("Raster: Channels"))] fn combine_channels( _: impl Ctx, _primary: (), @@ -402,7 +402,7 @@ fn image_value(_: impl Ctx, _primary: (), image: RasterDataTable) -> Raster // tiling: Tiling: bool, // } -#[node_macro::node(category("Raster"))] +#[node_macro::node(category("Raster: Pattern"))] #[allow(clippy::too_many_arguments)] fn noise_pattern( ctx: impl ExtractFootprint + Ctx, @@ -559,7 +559,7 @@ fn noise_pattern( result } -#[node_macro::node(category("Raster"))] +#[node_macro::node(category("Raster: Pattern"))] fn mandelbrot(ctx: impl ExtractFootprint + Send) -> RasterDataTable { let footprint = ctx.footprint(); let viewport_bounds = footprint.viewport_bounds_in_local_space(); diff --git a/node-graph/gstd/src/wasm_application_io.rs b/node-graph/gstd/src/wasm_application_io.rs index d3f344555e..6c8f52cc45 100644 --- a/node-graph/gstd/src/wasm_application_io.rs +++ b/node-graph/gstd/src/wasm_application_io.rs @@ -60,7 +60,7 @@ async fn create_surface<'a: 'n>(_: impl Ctx, editor: &'a WasmEditorApi) -> Arc(_: impl Ctx, _primary: (), #[scope("editor-api")] editor: &'a WasmEditorApi, #[name("URL")] url: String) -> Arc<[u8]> { let Some(api) = editor.application_io.as_ref() else { return Arc::from(include_bytes!("../../graph-craft/src/null.png").to_vec()); @@ -75,7 +75,7 @@ async fn load_resource<'a: 'n>(_: impl Ctx, _primary: (), #[scope("editor-api")] data } -#[node_macro::node(category("Network"))] +#[node_macro::node(category("Web Request"))] fn decode_image(_: impl Ctx, data: Arc<[u8]>) -> RasterDataTable { let Some(image) = image::load_from_memory(data.as_ref()).ok() else { return RasterDataTable::default(); From 11ba2cc0fe23cfd6ccbb59b771a13c7b5af32018 Mon Sep 17 00:00:00 2001 From: Keavon Chambers Date: Tue, 24 Jun 2025 04:55:27 -0700 Subject: [PATCH 17/44] New node: 'Split Segments' --- node-graph/gcore/src/ops.rs | 24 ------- node-graph/gcore/src/vector/vector_data.rs | 2 +- .../src/vector/vector_data/attributes.rs | 5 ++ node-graph/gcore/src/vector/vector_nodes.rs | 66 ++++++++++++++++++- 4 files changed, 70 insertions(+), 27 deletions(-) diff --git a/node-graph/gcore/src/ops.rs b/node-graph/gcore/src/ops.rs index 191feda247..b5a06abfc6 100644 --- a/node-graph/gcore/src/ops.rs +++ b/node-graph/gcore/src/ops.rs @@ -441,30 +441,6 @@ fn color_value(_: impl Ctx, _primary: (), #[default(Color::BLACK)] color: Option color } -// // Aims for interoperable compatibility with: -// // https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#:~:text=%27grdm%27%20%3D%20Gradient%20Map -// // https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#:~:text=Gradient%20settings%20(Photoshop%206.0) -// #[node_macro::node(category("Raster: Adjustment"))] -// async fn gradient_map>( -// _: impl Ctx, -// #[implementations( -// Color, -// RasterDataTable, -// GradientStops, -// )] -// mut image: T, -// gradient: GradientStops, -// reverse: bool, -// ) -> T { -// image.adjust(|color| { -// let intensity = color.luminance_srgb(); -// let intensity = if reverse { 1. - intensity } else { intensity }; -// gradient.evaluate(intensity as f64) -// }); - -// image -// } - /// Gets the color at the specified position along the gradient, given a position from 0 (left) to 1 (right). #[node_macro::node(category("Color"))] fn sample_gradient(_: impl Ctx, _primary: (), gradient: GradientStops, position: Fraction) -> Color { diff --git a/node-graph/gcore/src/vector/vector_data.rs b/node-graph/gcore/src/vector/vector_data.rs index 7d5a536357..66b2d22fc3 100644 --- a/node-graph/gcore/src/vector/vector_data.rs +++ b/node-graph/gcore/src/vector/vector_data.rs @@ -412,7 +412,7 @@ impl VectorData { } pub fn other_colinear_handle(&self, handle: HandleId) -> Option { - let pair = self.colinear_manipulators.iter().find(|pair| pair.iter().any(|&val| val == handle))?; + let pair = self.colinear_manipulators.iter().find(|pair| pair.contains(&handle))?; let other = pair.iter().copied().find(|&val| val != handle)?; if handle.to_manipulator_point().get_anchor(self) == other.to_manipulator_point().get_anchor(self) { Some(other) diff --git a/node-graph/gcore/src/vector/vector_data/attributes.rs b/node-graph/gcore/src/vector/vector_data/attributes.rs index 4d4511cefd..bb2ca1f91a 100644 --- a/node-graph/gcore/src/vector/vector_data/attributes.rs +++ b/node-graph/gcore/src/vector/vector_data/attributes.rs @@ -132,6 +132,11 @@ impl PointDomain { self.position.push(position); } + pub fn push_unchecked(&mut self, id: PointId, position: DVec2) { + self.id.push(id); + self.position.push(position); + } + pub fn positions(&self) -> &[DVec2] { &self.position } diff --git a/node-graph/gcore/src/vector/vector_nodes.rs b/node-graph/gcore/src/vector/vector_nodes.rs index 563cb5e12e..179269ad64 100644 --- a/node-graph/gcore/src/vector/vector_nodes.rs +++ b/node-graph/gcore/src/vector/vector_nodes.rs @@ -1314,8 +1314,11 @@ async fn sample_points(_: impl Ctx, vector_data: VectorDataTable, spacing: f64, result_table } +/// Splits a path at a given progress from 0 to 1 along the path, creating two new subpaths from the original one (if the path is initially open) or one open subpath (if the path is initially closed). +/// +/// If multiple subpaths make up the path, the whole number part of the progress value selects the subpath and the decimal part determines the position along it. #[node_macro::node(category("Vector: Modifier"), path(graphene_core::vector))] -async fn split_path(_: impl Ctx, mut vector_data: VectorDataTable, t_value: f64, parameterized_distance: bool, reverse: bool) -> VectorDataTable { +async fn split_path(_: impl Ctx, mut vector_data: VectorDataTable, progress: Fraction, parameterized_distance: bool, reverse: bool) -> VectorDataTable { let euclidian = !parameterized_distance; let bezpaths = vector_data @@ -1325,7 +1328,7 @@ async fn split_path(_: impl Ctx, mut vector_data: VectorDataTable, t_value: f64, .collect::>(); let bezpath_count = bezpaths.len() as f64; - let t_value = t_value.clamp(0., bezpath_count); + let t_value = progress.clamp(0., bezpath_count); let t_value = if reverse { bezpath_count - t_value } else { t_value }; let index = if t_value >= bezpath_count { (bezpath_count - 1.) as usize } else { t_value as usize }; @@ -1353,7 +1356,65 @@ async fn split_path(_: impl Ctx, mut vector_data: VectorDataTable, t_value: f64, vector_data } +/// Splits path segments into separate disconnected pieces where each is a distinct subpath. +#[node_macro::node(category("Vector: Modifier"), path(graphene_core::vector))] +async fn split_segments(_: impl Ctx, mut vector_data: VectorDataTable) -> VectorDataTable { + // Iterate through every segment and make a copy of each of its endpoints, then reassign each segment's endpoints to its own unique point copy + for vector_data_instance in vector_data.instance_mut_iter() { + let points_count = vector_data_instance.instance.point_domain.ids().len(); + let segments_count = vector_data_instance.instance.segment_domain.ids().len(); + + let mut point_usages = vec![0_usize; points_count]; + + // Count how many times each point is used as an endpoint of the segments + let start_points = vector_data_instance.instance.segment_domain.start_point().iter(); + let end_points = vector_data_instance.instance.segment_domain.end_point().iter(); + for (&start, &end) in start_points.zip(end_points) { + point_usages[start] += 1; + point_usages[end] += 1; + } + + let mut new_points = PointDomain::new(); + let mut offset_sum: usize = 0; + let mut points_with_new_offsets = Vec::with_capacity(points_count); + + // Build a new point domain with the original points, but with duplications based on their extra usages by the segments + for (index, (point_id, point)) in vector_data_instance.instance.point_domain.iter().enumerate() { + // Ensure at least one usage to preserve free-floating points not connected to any segments + let usage_count = point_usages[index].max(1); + + new_points.push_unchecked(point_id, point); + + for i in 1..usage_count { + new_points.push_unchecked(point_id.generate_from_hash(i as u64), point); + } + + points_with_new_offsets.push(offset_sum); + offset_sum += usage_count; + } + + // Reconcile the segment domain with the new points + vector_data_instance.instance.point_domain = new_points; + for original_segment_index in 0..segments_count { + let original_point_start_index = vector_data_instance.instance.segment_domain.start_point()[original_segment_index]; + let original_point_end_index = vector_data_instance.instance.segment_domain.end_point()[original_segment_index]; + + point_usages[original_point_start_index] -= 1; + point_usages[original_point_end_index] -= 1; + + let start_usage = points_with_new_offsets[original_point_start_index] + point_usages[original_point_start_index]; + let end_usage = points_with_new_offsets[original_point_end_index] + point_usages[original_point_end_index]; + + vector_data_instance.instance.segment_domain.set_start_point(original_segment_index, start_usage); + vector_data_instance.instance.segment_domain.set_end_point(original_segment_index, end_usage); + } + } + + vector_data +} + /// Determines the position of a point on the path, given by its progress from 0 to 1 along the path. +/// /// If multiple subpaths make up the path, the whole number part of the progress value selects the subpath and the decimal part determines the position along it. #[node_macro::node(name("Position on Path"), category("Vector: Measure"), path(graphene_core::vector))] async fn position_on_path( @@ -1390,6 +1451,7 @@ async fn position_on_path( } /// Determines the angle of the tangent at a point on the path, given by its progress from 0 to 1 along the path. +/// /// If multiple subpaths make up the path, the whole number part of the progress value selects the subpath and the decimal part determines the position along it. #[node_macro::node(name("Tangent on Path"), category("Vector: Measure"), path(graphene_core::vector))] async fn tangent_on_path( From 4a65ad290c1c4d5042a70e7f97fd440b79c3ca18 Mon Sep 17 00:00:00 2001 From: Keavon Chambers Date: Tue, 24 Jun 2025 18:23:09 -0700 Subject: [PATCH 18/44] Fix 'Boolean Operation' node merge-by-distance post-processing Fixes #2750 --- .../vector/algorithms/merge_by_distance.rs | 120 ++++++++++++++++- node-graph/gcore/src/vector/vector_nodes.rs | 126 +----------------- node-graph/gstd/src/vector.rs | 2 +- 3 files changed, 123 insertions(+), 125 deletions(-) diff --git a/node-graph/gcore/src/vector/algorithms/merge_by_distance.rs b/node-graph/gcore/src/vector/algorithms/merge_by_distance.rs index 99a94b3f5f..4d598f5fd5 100644 --- a/node-graph/gcore/src/vector/algorithms/merge_by_distance.rs +++ b/node-graph/gcore/src/vector/algorithms/merge_by_distance.rs @@ -1,16 +1,18 @@ -use crate::vector::{PointId, VectorData, VectorDataIndex}; -use glam::DVec2; +use crate::vector::{PointDomain, PointId, SegmentDomain, VectorData, VectorDataIndex}; +use glam::{DAffine2, DVec2}; use petgraph::prelude::UnGraphMap; use rustc_hash::FxHashSet; impl VectorData { /// Collapse all points with edges shorter than the specified distance - pub fn merge_by_distance(&mut self, distance: f64) { + pub fn merge_by_distance_topological(&mut self, distance: f64) { // Treat self as an undirected graph let indices = VectorDataIndex::build_from(self); + // TODO: We lose information on the winding order by using an undirected graph. Switch to a directed graph and fix the algorithm to handle that. // Graph containing only short edges, referencing the data graph let mut short_edges = UnGraphMap::new(); + for segment_id in self.segment_ids().iter().copied() { let length = indices.segment_chord_length(segment_id); if length < distance { @@ -92,4 +94,116 @@ impl VectorData { self.segment_domain.retain(|id| !segments_to_delete.contains(id), usize::MAX); self.point_domain.retain(&mut self.segment_domain, |id| !points_to_delete.contains(id)); } + + pub fn merge_by_distance_spatial(&mut self, transform: DAffine2, distance: f64) { + let point_count = self.point_domain.positions().len(); + + // Find min x and y for grid cell normalization + let mut min_x = f64::MAX; + let mut min_y = f64::MAX; + + // Calculate mins without collecting all positions + for &pos in self.point_domain.positions() { + let transformed_pos = transform.transform_point2(pos); + min_x = min_x.min(transformed_pos.x); + min_y = min_y.min(transformed_pos.y); + } + + // Create a spatial grid with cell size of 'distance' + use std::collections::HashMap; + let mut grid: HashMap<(i32, i32), Vec> = HashMap::new(); + + // Add points to grid cells without collecting all positions first + for i in 0..point_count { + let pos = transform.transform_point2(self.point_domain.positions()[i]); + let grid_x = ((pos.x - min_x) / distance).floor() as i32; + let grid_y = ((pos.y - min_y) / distance).floor() as i32; + + grid.entry((grid_x, grid_y)).or_default().push(i); + } + + // Create point index mapping for merged points + let mut point_index_map = vec![None; point_count]; + let mut merged_positions = Vec::new(); + let mut merged_indices = Vec::new(); + + // Process each point + for i in 0..point_count { + // Skip points that have already been processed + if point_index_map[i].is_some() { + continue; + } + + let pos_i = transform.transform_point2(self.point_domain.positions()[i]); + let grid_x = ((pos_i.x - min_x) / distance).floor() as i32; + let grid_y = ((pos_i.y - min_y) / distance).floor() as i32; + + let mut group = vec![i]; + + // Check only neighboring cells (3x3 grid around current cell) + for dx in -1..=1 { + for dy in -1..=1 { + let neighbor_cell = (grid_x + dx, grid_y + dy); + + if let Some(indices) = grid.get(&neighbor_cell) { + for &j in indices { + if j > i && point_index_map[j].is_none() { + let pos_j = transform.transform_point2(self.point_domain.positions()[j]); + if pos_i.distance(pos_j) <= distance { + group.push(j); + } + } + } + } + } + } + + // Create merged point - calculate positions as needed + let merged_position = group + .iter() + .map(|&idx| transform.transform_point2(self.point_domain.positions()[idx])) + .fold(DVec2::ZERO, |sum, pos| sum + pos) + / group.len() as f64; + + let merged_position = transform.inverse().transform_point2(merged_position); + let merged_index = merged_positions.len(); + + merged_positions.push(merged_position); + merged_indices.push(self.point_domain.ids()[group[0]]); + + // Update mapping for all points in the group + for &idx in &group { + point_index_map[idx] = Some(merged_index); + } + } + + // Create new point domain with merged points + let mut new_point_domain = PointDomain::new(); + for (idx, pos) in merged_indices.into_iter().zip(merged_positions) { + new_point_domain.push(idx, pos); + } + + // Update segment domain + let mut new_segment_domain = SegmentDomain::new(); + for segment_idx in 0..self.segment_domain.ids().len() { + let id = self.segment_domain.ids()[segment_idx]; + let start = self.segment_domain.start_point()[segment_idx]; + let end = self.segment_domain.end_point()[segment_idx]; + let handles = self.segment_domain.handles()[segment_idx]; + let stroke = self.segment_domain.stroke()[segment_idx]; + + // Get new indices for start and end points + let new_start = point_index_map[start].unwrap(); + let new_end = point_index_map[end].unwrap(); + + // Skip segments where start and end points were merged + if new_start != new_end { + new_segment_domain.push(id, new_start, new_end, handles, stroke); + } + } + + // Create new vector data + self.point_domain = new_point_domain; + self.segment_domain = new_segment_domain; + } } diff --git a/node-graph/gcore/src/vector/vector_nodes.rs b/node-graph/gcore/src/vector/vector_nodes.rs index 179269ad64..d2867fe27a 100644 --- a/node-graph/gcore/src/vector/vector_nodes.rs +++ b/node-graph/gcore/src/vector/vector_nodes.rs @@ -555,7 +555,7 @@ pub fn merge_by_distance( vector_data: VectorDataTable, #[default(0.1)] #[hard_min(0.0001)] - distance: Length, + distance: PixelLength, algorithm: MergeByDistanceAlgorithm, ) -> VectorDataTable { let mut result_table = VectorDataTable::default(); @@ -563,130 +563,14 @@ pub fn merge_by_distance( match algorithm { MergeByDistanceAlgorithm::Spatial => { for mut vector_data_instance in vector_data.instance_iter() { - let vector_data_transform = vector_data_instance.transform; - let vector_data = vector_data_instance.instance; - - let point_count = vector_data.point_domain.positions().len(); - - // Find min x and y for grid cell normalization - let mut min_x = f64::MAX; - let mut min_y = f64::MAX; - - // Calculate mins without collecting all positions - for &pos in vector_data.point_domain.positions() { - let transformed_pos = vector_data_transform.transform_point2(pos); - min_x = min_x.min(transformed_pos.x); - min_y = min_y.min(transformed_pos.y); - } - - // Create a spatial grid with cell size of 'distance' - use std::collections::HashMap; - let mut grid: HashMap<(i32, i32), Vec> = HashMap::new(); - - // Add points to grid cells without collecting all positions first - for i in 0..point_count { - let pos = vector_data_transform.transform_point2(vector_data.point_domain.positions()[i]); - let grid_x = ((pos.x - min_x) / distance).floor() as i32; - let grid_y = ((pos.y - min_y) / distance).floor() as i32; - - grid.entry((grid_x, grid_y)).or_default().push(i); - } - - // Create point index mapping for merged points - let mut point_index_map = vec![None; point_count]; - let mut merged_positions = Vec::new(); - let mut merged_indices = Vec::new(); - - // Process each point - for i in 0..point_count { - // Skip points that have already been processed - if point_index_map[i].is_some() { - continue; - } - - let pos_i = vector_data_transform.transform_point2(vector_data.point_domain.positions()[i]); - let grid_x = ((pos_i.x - min_x) / distance).floor() as i32; - let grid_y = ((pos_i.y - min_y) / distance).floor() as i32; - - let mut group = vec![i]; - - // Check only neighboring cells (3x3 grid around current cell) - for dx in -1..=1 { - for dy in -1..=1 { - let neighbor_cell = (grid_x + dx, grid_y + dy); - - if let Some(indices) = grid.get(&neighbor_cell) { - for &j in indices { - if j > i && point_index_map[j].is_none() { - let pos_j = vector_data_transform.transform_point2(vector_data.point_domain.positions()[j]); - if pos_i.distance(pos_j) <= distance { - group.push(j); - } - } - } - } - } - } - - // Create merged point - calculate positions as needed - let merged_position = group - .iter() - .map(|&idx| vector_data_transform.transform_point2(vector_data.point_domain.positions()[idx])) - .fold(DVec2::ZERO, |sum, pos| sum + pos) - / group.len() as f64; - - let merged_position = vector_data_transform.inverse().transform_point2(merged_position); - let merged_index = merged_positions.len(); - - merged_positions.push(merged_position); - merged_indices.push(vector_data.point_domain.ids()[group[0]]); - - // Update mapping for all points in the group - for &idx in &group { - point_index_map[idx] = Some(merged_index); - } - } - - // Create new point domain with merged points - let mut new_point_domain = PointDomain::new(); - for (idx, pos) in merged_indices.into_iter().zip(merged_positions) { - new_point_domain.push(idx, pos); - } - - // Update segment domain - let mut new_segment_domain = SegmentDomain::new(); - for segment_idx in 0..vector_data.segment_domain.ids().len() { - let id = vector_data.segment_domain.ids()[segment_idx]; - let start = vector_data.segment_domain.start_point()[segment_idx]; - let end = vector_data.segment_domain.end_point()[segment_idx]; - let handles = vector_data.segment_domain.handles()[segment_idx]; - let stroke = vector_data.segment_domain.stroke()[segment_idx]; - - // Get new indices for start and end points - let new_start = point_index_map[start].unwrap(); - let new_end = point_index_map[end].unwrap(); - - // Skip segments where start and end points were merged - if new_start != new_end { - new_segment_domain.push(id, new_start, new_end, handles, stroke); - } - } - - // Create new vector data - let mut result = vector_data.clone(); - result.point_domain = new_point_domain; - result.segment_domain = new_segment_domain; - - // Create and return the result - vector_data_instance.instance = result; - vector_data_instance.source_node_id = None; + vector_data_instance.instance.merge_by_distance_spatial(vector_data_instance.transform, distance); result_table.push(vector_data_instance); } } MergeByDistanceAlgorithm::Topological => { - for mut source_instance in vector_data.instance_iter() { - source_instance.instance.merge_by_distance(distance); - result_table.push(source_instance); + for mut vector_data_instance in vector_data.instance_iter() { + vector_data_instance.instance.merge_by_distance_topological(distance); + result_table.push(vector_data_instance); } } } diff --git a/node-graph/gstd/src/vector.rs b/node-graph/gstd/src/vector.rs index 6d7ea1ce9a..8b82d23dd6 100644 --- a/node-graph/gstd/src/vector.rs +++ b/node-graph/gstd/src/vector.rs @@ -43,7 +43,7 @@ async fn boolean_operation + 'n + Send + Clone>( result_vector_data.instance.upstream_graphic_group = Some(group_of_paths.clone()); // Clean up the boolean operation result by merging duplicated points - result_vector_data.instance.merge_by_distance(0.001); + result_vector_data.instance.merge_by_distance_spatial(*result_vector_data.transform, 0.0001); } result_vector_data_table From 504af4e68d2bd1a023784108c48af2b3e9fe9234 Mon Sep 17 00:00:00 2001 From: Ahmed Moharram <110837564+Moharum1@users.noreply.github.com> Date: Thu, 26 Jun 2025 06:14:08 +0300 Subject: [PATCH 19/44] Rename 'Sample Points' node to 'Sample Polyline' and add a parameter spacing based on separation or quantity (#2727) * Added Count point Radio button to property pannel * Implemented on Count radio button functionality * Fixed linting and Title case problem * Fixing more linting problem * Instance tables refactor part 8: Make repeater nodes use pivot not bbox and output instance type not group; rename 'Flatten Vector Elements' to 'Flatten Path' and add 'Flatten Vector' (#2697) Make repeater nodes use pivot not bbox and output instance type not group; rename 'Flatten Vector Elements' to 'Flatten Path' and add 'Flatten Vector' * Refactor the 'Bounding Box' node to use Kurbo instead of Bezier-rs (#2662) * use kurbo's default accuracy constant * fix append_bezpath() method * refactor bounding box node * fix append bezpath implementation. * comments --------- Co-authored-by: Keavon Chambers * Add overlays for free-floating anchors on hovered/selected vector layers (#2630) * Add selection overlay for free-floating anchors * Add hover overlay for free-floating anchors * Refactor outline_free_floating anchor * Add single-anchor click targets on VectorData * Modify ClickTarget to adapt for Subpath and PointGroup * Fix Rust formatting * Remove debug statements * Add point groups support in VectorDataTable::add_upstream_click_targets * Improve overlay for free floating anchors * Remove datatype for nodes_to_shift * Fix formatting in select_tool.rs * Lints * Code review * Remove references to point_group * Refactor ManipulatorGroup for FreePoint in ClickTargetGroup * Rename ClickTargetGroup to ClickTargetType * Refactor outline_free_floating_anchors into outline * Adapt TransformCage to disable dragging and rotating on a single anchor layer * Fix hover on single points * Fix comments * Lints * Code review pass --------- Co-authored-by: Keavon Chambers * Add anchor sliding along adjacent segments in the Path tool (#2682) * Improved comments * Add point sliding with approximate t value * Add similarity calculation * Numerical approach to fit the curve * Reliable point sliding for cubic segments * Fix formatting and clean comments * Fix cubic with one handle logic * Cancel on right click and escape * Two parameter optimization * Esc/ Right click cancellation * Code review * Fix dynamic hints * Revert selected_points_counts and fix comments * Code review --------- Co-authored-by: Keavon Chambers * Fix Sample Points node to avoid duplicating endpoints instead of closing its sampled paths (#2714) * Skip duplicate endpoint and close sampled paths in Sample Points node Closes #2713 * Comment --------- Co-authored-by: Keavon Chambers * Implemented on Count radio button functionality * Fixed linting and Title case problem * The sample count can now work with adaptive spacing * Readying for production * Rename to 'Sample Polyline' and add migration * Upgrade demo artwork * Add monomorphization --------- Co-authored-by: Keavon Chambers Co-authored-by: Priyanshu Co-authored-by: seam0s <153828136+seam0s-dev@users.noreply.github.com> Co-authored-by: Adesh Gupta <148623820+4adex@users.noreply.github.com> Co-authored-by: Ezbaze <68749104+Ezbaze@users.noreply.github.com> --- demo-artwork/parametric-dunescape.graphite | 2 +- .../procedural-string-lights.graphite | 2 +- demo-artwork/red-dress.graphite | 2 +- .../node_graph/document_node_definitions.rs | 49 +++++++++----- .../document/node_graph/node_properties.rs | 61 ++++++++++++++++- .../portfolio/portfolio_message_handler.rs | 27 +++++++- node-graph/gcore/src/logic.rs | 2 +- .../vector/algorithms/bezpath_algorithms.rs | 45 +++++++++---- node-graph/gcore/src/vector/misc.rs | 11 ++++ node-graph/gcore/src/vector/vector_nodes.rs | 66 +++++++++++-------- node-graph/graph-craft/src/document/value.rs | 1 + .../interpreted-executor/src/node_registry.rs | 1 + 12 files changed, 206 insertions(+), 63 deletions(-) diff --git a/demo-artwork/parametric-dunescape.graphite b/demo-artwork/parametric-dunescape.graphite index 86ba52f545..0cc3a05d88 100644 --- a/demo-artwork/parametric-dunescape.graphite +++ b/demo-artwork/parametric-dunescape.graphite @@ -1 +1 @@ -{"network_interface":{"network":{"exports":[{"Node":{"node_id":4445985685181725042,"output_index":0,"lambda":false}}],"nodes":[[17154757625902243313,{"inputs":[{"Value":{"tagged_value":"None","exposed":true}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.23529412,"green":0.23529412,"blue":0.24313726,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"F64":1670.79570439},"exposed":false}},{"Value":{"tagged_value":{"F64":24.0},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2288754089236120499,"output_index":0,"lambda":false}}],"nodes":[[11731553664207576737,{"inputs":[{"Node":{"node_id":5663116427189655422,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":48.900000000000006},"exposed":false}},{"Node":{"node_id":7828034197076821310,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[14158287945315818946,{"inputs":[{"Node":{"node_id":16943732999059587742,"output_index":0,"lambda":false}},{"Node":{"node_id":14577956936089455769,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.6181095265062186,3.496297826945966]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.4855225354961647,0.31002285853371414]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2288754089236120499,{"inputs":[{"Node":{"node_id":14158287945315818946,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SplineNode"}},"visible":true,"skip_deduplication":false}],[10202767637947785546,{"inputs":[{"Node":{"node_id":11731553664207576737,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":172.90000000000003},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::ImpureMemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7828034197076821310,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":3}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::ToU32Node"}},"visible":true,"skip_deduplication":false}],[640915213983348287,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":4000.0},"exposed":false}},{"Value":{"tagged_value":{"F64":500.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::generator_nodes::RectangleNode"}},"visible":true,"skip_deduplication":false}],[1791308547102433540,{"inputs":[{"Node":{"node_id":640915213983348287,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":1}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.99607843,"green":0.827451,"blue":0.65882355,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14577956936089455769,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":1050.10498991},"exposed":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":2}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::CoordinateValueNode"}},"visible":true,"skip_deduplication":false}],[5663116427189655422,{"inputs":[{"Node":{"node_id":1791308547102433540,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":800.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::ImpureMemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16943732999059587742,{"inputs":[{"Node":{"node_id":10202767637947785546,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.399999999999956},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3683309254695891012,{"inputs":[{"Value":{"tagged_value":"None","exposed":true}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.68235296,"green":0.5372549,"blue":0.4627451,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"F64":1485.34393334},"exposed":false}},{"Value":{"tagged_value":{"F64":225.0},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2288754089236120499,"output_index":0,"lambda":false}}],"nodes":[[11731553664207576737,{"inputs":[{"Node":{"node_id":5663116427189655422,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":48.900000000000006},"exposed":false}},{"Node":{"node_id":7828034197076821310,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[14158287945315818946,{"inputs":[{"Node":{"node_id":16943732999059587742,"output_index":0,"lambda":false}},{"Node":{"node_id":14577956936089455769,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.6181095265062186,3.496297826945966]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.4855225354961647,0.31002285853371414]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2288754089236120499,{"inputs":[{"Node":{"node_id":14158287945315818946,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SplineNode"}},"visible":true,"skip_deduplication":false}],[10202767637947785546,{"inputs":[{"Node":{"node_id":11731553664207576737,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":172.90000000000003},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::ImpureMemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7828034197076821310,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":3}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::ToU32Node"}},"visible":true,"skip_deduplication":false}],[640915213983348287,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":4000.0},"exposed":false}},{"Value":{"tagged_value":{"F64":500.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::generator_nodes::RectangleNode"}},"visible":true,"skip_deduplication":false}],[1791308547102433540,{"inputs":[{"Node":{"node_id":640915213983348287,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":1}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.99607843,"green":0.827451,"blue":0.65882355,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14577956936089455769,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":1050.10498991},"exposed":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":2}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::CoordinateValueNode"}},"visible":true,"skip_deduplication":false}],[5663116427189655422,{"inputs":[{"Node":{"node_id":1791308547102433540,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":800.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::ImpureMemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16943732999059587742,{"inputs":[{"Node":{"node_id":10202767637947785546,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.399999999999956},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13644002059194136823,{"inputs":[{"Node":{"node_id":17437077810654043142,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":5.599999999999968},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[4037968351431607570,{"inputs":[{"Value":{"tagged_value":"None","exposed":true}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8666667,"green":0.69803923,"blue":0.56078434,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"F64":1442.36628417},"exposed":false}},{"Value":{"tagged_value":{"F64":318.0},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2288754089236120499,"output_index":0,"lambda":false}}],"nodes":[[11731553664207576737,{"inputs":[{"Node":{"node_id":5663116427189655422,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":48.900000000000006},"exposed":false}},{"Node":{"node_id":7828034197076821310,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[14158287945315818946,{"inputs":[{"Node":{"node_id":16943732999059587742,"output_index":0,"lambda":false}},{"Node":{"node_id":14577956936089455769,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.6181095265062186,3.496297826945966]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.4855225354961647,0.31002285853371414]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2288754089236120499,{"inputs":[{"Node":{"node_id":14158287945315818946,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SplineNode"}},"visible":true,"skip_deduplication":false}],[10202767637947785546,{"inputs":[{"Node":{"node_id":11731553664207576737,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":172.90000000000003},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::ImpureMemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7828034197076821310,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":3}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::ToU32Node"}},"visible":true,"skip_deduplication":false}],[640915213983348287,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":4000.0},"exposed":false}},{"Value":{"tagged_value":{"F64":500.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::generator_nodes::RectangleNode"}},"visible":true,"skip_deduplication":false}],[1791308547102433540,{"inputs":[{"Node":{"node_id":640915213983348287,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":1}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.99607843,"green":0.827451,"blue":0.65882355,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14577956936089455769,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":1050.10498991},"exposed":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":2}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::CoordinateValueNode"}},"visible":true,"skip_deduplication":false}],[5663116427189655422,{"inputs":[{"Node":{"node_id":1791308547102433540,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":800.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::ImpureMemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16943732999059587742,{"inputs":[{"Node":{"node_id":10202767637947785546,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.399999999999956},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13323241418027154136,{"inputs":[{"Value":{"tagged_value":"None","exposed":true}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.18039216,"green":0.19215687,"blue":0.21960784,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"F64":1733.30579952},"exposed":false}},{"Value":{"tagged_value":{"F64":77.0},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2288754089236120499,"output_index":0,"lambda":false}}],"nodes":[[11731553664207576737,{"inputs":[{"Node":{"node_id":5663116427189655422,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":48.900000000000006},"exposed":false}},{"Node":{"node_id":7828034197076821310,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[14158287945315818946,{"inputs":[{"Node":{"node_id":16943732999059587742,"output_index":0,"lambda":false}},{"Node":{"node_id":14577956936089455769,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.6181095265062186,3.496297826945966]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.4855225354961647,0.31002285853371414]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2288754089236120499,{"inputs":[{"Node":{"node_id":14158287945315818946,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SplineNode"}},"visible":true,"skip_deduplication":false}],[10202767637947785546,{"inputs":[{"Node":{"node_id":11731553664207576737,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":172.90000000000003},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::ImpureMemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7828034197076821310,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":3}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::ToU32Node"}},"visible":true,"skip_deduplication":false}],[640915213983348287,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":4000.0},"exposed":false}},{"Value":{"tagged_value":{"F64":500.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::generator_nodes::RectangleNode"}},"visible":true,"skip_deduplication":false}],[1791308547102433540,{"inputs":[{"Node":{"node_id":640915213983348287,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":1}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.99607843,"green":0.827451,"blue":0.65882355,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14577956936089455769,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":1050.10498991},"exposed":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":2}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::CoordinateValueNode"}},"visible":true,"skip_deduplication":false}],[5663116427189655422,{"inputs":[{"Node":{"node_id":1791308547102433540,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":800.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::ImpureMemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16943732999059587742,{"inputs":[{"Node":{"node_id":10202767637947785546,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.399999999999956},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[12110920487474373676,{"inputs":[{"Node":{"node_id":12639486733043466090,"output_index":0,"lambda":false}},{"Node":{"node_id":13323241418027154136,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10806978668166337270,{"inputs":[{"Value":{"tagged_value":"None","exposed":true}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.21176471,"green":0.21568628,"blue":0.23137255,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"F64":1579.30304164},"exposed":false}},{"Value":{"tagged_value":{"F64":142.0},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2288754089236120499,"output_index":0,"lambda":false}}],"nodes":[[11731553664207576737,{"inputs":[{"Node":{"node_id":5663116427189655422,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":48.900000000000006},"exposed":false}},{"Node":{"node_id":7828034197076821310,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[14158287945315818946,{"inputs":[{"Node":{"node_id":16943732999059587742,"output_index":0,"lambda":false}},{"Node":{"node_id":14577956936089455769,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.6181095265062186,3.496297826945966]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.4855225354961647,0.31002285853371414]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2288754089236120499,{"inputs":[{"Node":{"node_id":14158287945315818946,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SplineNode"}},"visible":true,"skip_deduplication":false}],[10202767637947785546,{"inputs":[{"Node":{"node_id":11731553664207576737,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":172.90000000000003},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::ImpureMemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7828034197076821310,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":3}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::ToU32Node"}},"visible":true,"skip_deduplication":false}],[640915213983348287,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":4000.0},"exposed":false}},{"Value":{"tagged_value":{"F64":500.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::generator_nodes::RectangleNode"}},"visible":true,"skip_deduplication":false}],[1791308547102433540,{"inputs":[{"Node":{"node_id":640915213983348287,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":1}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.99607843,"green":0.827451,"blue":0.65882355,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14577956936089455769,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":1050.10498991},"exposed":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":2}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::CoordinateValueNode"}},"visible":true,"skip_deduplication":false}],[5663116427189655422,{"inputs":[{"Node":{"node_id":1791308547102433540,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":800.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::ImpureMemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16943732999059587742,{"inputs":[{"Node":{"node_id":10202767637947785546,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.399999999999956},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4390668436091073484,{"inputs":[{"Node":{"node_id":13676600738025998635,"output_index":0,"lambda":false}},{"Node":{"node_id":12122314434656187176,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[5883606306991910210,{"inputs":[{"Value":{"tagged_value":"None","exposed":true}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.4862745,"green":0.43137255,"blue":0.39607844,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"F64":1524.31304726},"exposed":false}},{"Value":{"tagged_value":{"F64":175.0},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2288754089236120499,"output_index":0,"lambda":false}}],"nodes":[[11731553664207576737,{"inputs":[{"Node":{"node_id":5663116427189655422,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":48.900000000000006},"exposed":false}},{"Node":{"node_id":7828034197076821310,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[14158287945315818946,{"inputs":[{"Node":{"node_id":16943732999059587742,"output_index":0,"lambda":false}},{"Node":{"node_id":14577956936089455769,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.6181095265062186,3.496297826945966]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.4855225354961647,0.31002285853371414]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2288754089236120499,{"inputs":[{"Node":{"node_id":14158287945315818946,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SplineNode"}},"visible":true,"skip_deduplication":false}],[10202767637947785546,{"inputs":[{"Node":{"node_id":11731553664207576737,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":172.90000000000003},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::ImpureMemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7828034197076821310,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":3}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::ToU32Node"}},"visible":true,"skip_deduplication":false}],[640915213983348287,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":4000.0},"exposed":false}},{"Value":{"tagged_value":{"F64":500.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::generator_nodes::RectangleNode"}},"visible":true,"skip_deduplication":false}],[1791308547102433540,{"inputs":[{"Node":{"node_id":640915213983348287,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":1}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.99607843,"green":0.827451,"blue":0.65882355,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14577956936089455769,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":1050.10498991},"exposed":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":2}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::CoordinateValueNode"}},"visible":true,"skip_deduplication":false}],[5663116427189655422,{"inputs":[{"Node":{"node_id":1791308547102433540,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":800.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::ImpureMemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16943732999059587742,{"inputs":[{"Node":{"node_id":10202767637947785546,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.399999999999956},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13132104524813958174,{"inputs":[{"Node":{"node_id":4390668436091073484,"output_index":0,"lambda":false}},{"Node":{"node_id":2163528024003768644,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[12416569579970107543,{"inputs":[{"Node":{"node_id":13644002059194136823,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SplineNode"}},"visible":true,"skip_deduplication":false}],[9069881382900058607,{"inputs":[{"Value":{"tagged_value":{"GraphicGroup":{"instance":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":4037968351431607570,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[12639486733043466090,{"inputs":[{"Node":{"node_id":8804763001225416124,"output_index":0,"lambda":false}},{"Node":{"node_id":1801066723091712434,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7128559142392931896,{"inputs":[{"Value":{"tagged_value":"None","exposed":true}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.15686275,"green":0.16862746,"blue":0.1882353,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"F64":1803.43646796},"exposed":false}},{"Value":{"tagged_value":{"F64":35.0},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2288754089236120499,"output_index":0,"lambda":false}}],"nodes":[[11731553664207576737,{"inputs":[{"Node":{"node_id":5663116427189655422,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":48.900000000000006},"exposed":false}},{"Node":{"node_id":7828034197076821310,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[14158287945315818946,{"inputs":[{"Node":{"node_id":16943732999059587742,"output_index":0,"lambda":false}},{"Node":{"node_id":14577956936089455769,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.6181095265062186,3.496297826945966]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.4855225354961647,0.31002285853371414]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2288754089236120499,{"inputs":[{"Node":{"node_id":14158287945315818946,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SplineNode"}},"visible":true,"skip_deduplication":false}],[10202767637947785546,{"inputs":[{"Node":{"node_id":11731553664207576737,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":172.90000000000003},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::ImpureMemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7828034197076821310,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":3}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::ToU32Node"}},"visible":true,"skip_deduplication":false}],[640915213983348287,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":4000.0},"exposed":false}},{"Value":{"tagged_value":{"F64":500.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::generator_nodes::RectangleNode"}},"visible":true,"skip_deduplication":false}],[1791308547102433540,{"inputs":[{"Node":{"node_id":640915213983348287,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":1}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.99607843,"green":0.827451,"blue":0.65882355,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14577956936089455769,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":1050.10498991},"exposed":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":2}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::CoordinateValueNode"}},"visible":true,"skip_deduplication":false}],[5663116427189655422,{"inputs":[{"Node":{"node_id":1791308547102433540,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":800.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::ImpureMemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16943732999059587742,{"inputs":[{"Node":{"node_id":10202767637947785546,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.399999999999956},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[17327221498641745184,{"inputs":[{"Node":{"node_id":12317719117993811200,"output_index":0,"lambda":false}},{"Node":{"node_id":3683309254695891012,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7711570794020903773,{"inputs":[{"Value":{"tagged_value":"None","exposed":true}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8784314,"green":0.49019608,"blue":0.36862746,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"F64":1513.3360814},"exposed":false}},{"Value":{"tagged_value":{"F64":22.0},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2288754089236120499,"output_index":0,"lambda":false}}],"nodes":[[11731553664207576737,{"inputs":[{"Node":{"node_id":5663116427189655422,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":48.900000000000006},"exposed":false}},{"Node":{"node_id":7828034197076821310,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[14158287945315818946,{"inputs":[{"Node":{"node_id":16943732999059587742,"output_index":0,"lambda":false}},{"Node":{"node_id":14577956936089455769,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.6181095265062186,3.496297826945966]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.4855225354961647,0.31002285853371414]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2288754089236120499,{"inputs":[{"Node":{"node_id":14158287945315818946,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SplineNode"}},"visible":true,"skip_deduplication":false}],[10202767637947785546,{"inputs":[{"Node":{"node_id":11731553664207576737,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":172.90000000000003},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::ImpureMemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7828034197076821310,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":3}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::ToU32Node"}},"visible":true,"skip_deduplication":false}],[640915213983348287,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":4000.0},"exposed":false}},{"Value":{"tagged_value":{"F64":500.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::generator_nodes::RectangleNode"}},"visible":true,"skip_deduplication":false}],[1791308547102433540,{"inputs":[{"Node":{"node_id":640915213983348287,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":1}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.99607843,"green":0.827451,"blue":0.65882355,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14577956936089455769,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":1050.10498991},"exposed":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":2}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::CoordinateValueNode"}},"visible":true,"skip_deduplication":false}],[5663116427189655422,{"inputs":[{"Node":{"node_id":1791308547102433540,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":800.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::ImpureMemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16943732999059587742,{"inputs":[{"Node":{"node_id":10202767637947785546,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.399999999999956},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10686861494573327243,{"inputs":[{"Node":{"node_id":11386926595254122633,"output_index":0,"lambda":false}},{"Node":{"node_id":10806978668166337270,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[17589660903986237301,{"inputs":[{"Value":{"tagged_value":"None","exposed":true}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.9529412,"green":0.6431373,"blue":0.42352942,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"F64":1614.38741737},"exposed":false}},{"Value":{"tagged_value":{"F64":17.0},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2288754089236120499,"output_index":0,"lambda":false}}],"nodes":[[11731553664207576737,{"inputs":[{"Node":{"node_id":5663116427189655422,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":48.900000000000006},"exposed":false}},{"Node":{"node_id":7828034197076821310,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[14158287945315818946,{"inputs":[{"Node":{"node_id":16943732999059587742,"output_index":0,"lambda":false}},{"Node":{"node_id":14577956936089455769,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.6181095265062186,3.496297826945966]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.4855225354961647,0.31002285853371414]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2288754089236120499,{"inputs":[{"Node":{"node_id":14158287945315818946,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SplineNode"}},"visible":true,"skip_deduplication":false}],[10202767637947785546,{"inputs":[{"Node":{"node_id":11731553664207576737,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":172.90000000000003},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::ImpureMemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7828034197076821310,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":3}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::ToU32Node"}},"visible":true,"skip_deduplication":false}],[640915213983348287,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":4000.0},"exposed":false}},{"Value":{"tagged_value":{"F64":500.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::generator_nodes::RectangleNode"}},"visible":true,"skip_deduplication":false}],[1791308547102433540,{"inputs":[{"Node":{"node_id":640915213983348287,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":1}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.99607843,"green":0.827451,"blue":0.65882355,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14577956936089455769,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":1050.10498991},"exposed":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":2}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::CoordinateValueNode"}},"visible":true,"skip_deduplication":false}],[5663116427189655422,{"inputs":[{"Node":{"node_id":1791308547102433540,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":800.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::ImpureMemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16943732999059587742,{"inputs":[{"Node":{"node_id":10202767637947785546,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.399999999999956},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2163528024003768644,{"inputs":[{"Node":{"node_id":12110920487474373676,"output_index":0,"lambda":false}},{"Node":{"node_id":7128559142392931896,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[6523786079462141312,{"inputs":[{"Value":{"tagged_value":"None","exposed":true}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.85882354,"green":0.57254905,"blue":0.43529412,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"F64":1491.01593158},"exposed":false}},{"Value":{"tagged_value":{"F64":173.0},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2288754089236120499,"output_index":0,"lambda":false}}],"nodes":[[11731553664207576737,{"inputs":[{"Node":{"node_id":5663116427189655422,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":48.900000000000006},"exposed":false}},{"Node":{"node_id":7828034197076821310,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[14158287945315818946,{"inputs":[{"Node":{"node_id":16943732999059587742,"output_index":0,"lambda":false}},{"Node":{"node_id":14577956936089455769,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.6181095265062186,3.496297826945966]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.4855225354961647,0.31002285853371414]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2288754089236120499,{"inputs":[{"Node":{"node_id":14158287945315818946,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SplineNode"}},"visible":true,"skip_deduplication":false}],[10202767637947785546,{"inputs":[{"Node":{"node_id":11731553664207576737,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":172.90000000000003},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::ImpureMemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7828034197076821310,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":3}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::ToU32Node"}},"visible":true,"skip_deduplication":false}],[640915213983348287,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":4000.0},"exposed":false}},{"Value":{"tagged_value":{"F64":500.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::generator_nodes::RectangleNode"}},"visible":true,"skip_deduplication":false}],[1791308547102433540,{"inputs":[{"Node":{"node_id":640915213983348287,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":1}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.99607843,"green":0.827451,"blue":0.65882355,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14577956936089455769,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":1050.10498991},"exposed":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":2}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::CoordinateValueNode"}},"visible":true,"skip_deduplication":false}],[5663116427189655422,{"inputs":[{"Node":{"node_id":1791308547102433540,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":800.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::ImpureMemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16943732999059587742,{"inputs":[{"Node":{"node_id":10202767637947785546,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.399999999999956},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11386926595254122633,{"inputs":[{"Value":{"tagged_value":{"GraphicGroup":{"instance":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":6523786079462141312,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15002088321732485705,{"inputs":[{"Value":{"tagged_value":"None","exposed":true}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.99607843,"green":0.827451,"blue":0.65882355,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"F64":1343.63187023},"exposed":false}},{"Value":{"tagged_value":{"F64":349.0},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2288754089236120499,"output_index":0,"lambda":false}}],"nodes":[[11731553664207576737,{"inputs":[{"Node":{"node_id":5663116427189655422,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":48.900000000000006},"exposed":false}},{"Node":{"node_id":7828034197076821310,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[14158287945315818946,{"inputs":[{"Node":{"node_id":16943732999059587742,"output_index":0,"lambda":false}},{"Node":{"node_id":14577956936089455769,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.6181095265062186,3.496297826945966]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.4855225354961647,0.31002285853371414]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2288754089236120499,{"inputs":[{"Node":{"node_id":14158287945315818946,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SplineNode"}},"visible":true,"skip_deduplication":false}],[10202767637947785546,{"inputs":[{"Node":{"node_id":11731553664207576737,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":172.90000000000003},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::ImpureMemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7828034197076821310,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":3}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::ToU32Node"}},"visible":true,"skip_deduplication":false}],[640915213983348287,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":4000.0},"exposed":false}},{"Value":{"tagged_value":{"F64":500.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::generator_nodes::RectangleNode"}},"visible":true,"skip_deduplication":false}],[1791308547102433540,{"inputs":[{"Node":{"node_id":640915213983348287,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":1}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.99607843,"green":0.827451,"blue":0.65882355,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14577956936089455769,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":1050.10498991},"exposed":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":2}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::CoordinateValueNode"}},"visible":true,"skip_deduplication":false}],[5663116427189655422,{"inputs":[{"Node":{"node_id":1791308547102433540,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":800.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::ImpureMemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16943732999059587742,{"inputs":[{"Node":{"node_id":10202767637947785546,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.399999999999956},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3934928477288442109,{"inputs":[{"Node":{"node_id":239716716021064150,"output_index":0,"lambda":false}},{"Node":{"node_id":17589660903986237301,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16611856724057842399,{"inputs":[{"Value":{"tagged_value":"None","exposed":true}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.23529412,"green":0.23529412,"blue":0.24313726,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"F64":1554.40785539},"exposed":false}},{"Value":{"tagged_value":{"F64":50.0},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2288754089236120499,"output_index":0,"lambda":false}}],"nodes":[[11731553664207576737,{"inputs":[{"Node":{"node_id":5663116427189655422,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":48.900000000000006},"exposed":false}},{"Node":{"node_id":7828034197076821310,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[14158287945315818946,{"inputs":[{"Node":{"node_id":16943732999059587742,"output_index":0,"lambda":false}},{"Node":{"node_id":14577956936089455769,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.6181095265062186,3.496297826945966]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.4855225354961647,0.31002285853371414]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2288754089236120499,{"inputs":[{"Node":{"node_id":14158287945315818946,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SplineNode"}},"visible":true,"skip_deduplication":false}],[10202767637947785546,{"inputs":[{"Node":{"node_id":11731553664207576737,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":172.90000000000003},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::ImpureMemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7828034197076821310,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":3}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::ToU32Node"}},"visible":true,"skip_deduplication":false}],[640915213983348287,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":4000.0},"exposed":false}},{"Value":{"tagged_value":{"F64":500.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::generator_nodes::RectangleNode"}},"visible":true,"skip_deduplication":false}],[1791308547102433540,{"inputs":[{"Node":{"node_id":640915213983348287,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":1}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.99607843,"green":0.827451,"blue":0.65882355,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14577956936089455769,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":1050.10498991},"exposed":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":2}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::CoordinateValueNode"}},"visible":true,"skip_deduplication":false}],[5663116427189655422,{"inputs":[{"Node":{"node_id":1791308547102433540,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":800.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::ImpureMemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16943732999059587742,{"inputs":[{"Node":{"node_id":10202767637947785546,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.399999999999956},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3726756269632080543,{"inputs":[{"Value":{"tagged_value":"None","exposed":true}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.5254902,"green":0.45882353,"blue":0.41568628,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"F64":1465.6573046},"exposed":false}},{"Value":{"tagged_value":{"F64":230.0},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2288754089236120499,"output_index":0,"lambda":false}}],"nodes":[[11731553664207576737,{"inputs":[{"Node":{"node_id":5663116427189655422,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":48.900000000000006},"exposed":false}},{"Node":{"node_id":7828034197076821310,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[14158287945315818946,{"inputs":[{"Node":{"node_id":16943732999059587742,"output_index":0,"lambda":false}},{"Node":{"node_id":14577956936089455769,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.6181095265062186,3.496297826945966]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.4855225354961647,0.31002285853371414]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2288754089236120499,{"inputs":[{"Node":{"node_id":14158287945315818946,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SplineNode"}},"visible":true,"skip_deduplication":false}],[10202767637947785546,{"inputs":[{"Node":{"node_id":11731553664207576737,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":172.90000000000003},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::ImpureMemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7828034197076821310,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":3}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::ToU32Node"}},"visible":true,"skip_deduplication":false}],[640915213983348287,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":4000.0},"exposed":false}},{"Value":{"tagged_value":{"F64":500.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::generator_nodes::RectangleNode"}},"visible":true,"skip_deduplication":false}],[1791308547102433540,{"inputs":[{"Node":{"node_id":640915213983348287,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":1}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.99607843,"green":0.827451,"blue":0.65882355,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14577956936089455769,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":1050.10498991},"exposed":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":2}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::CoordinateValueNode"}},"visible":true,"skip_deduplication":false}],[5663116427189655422,{"inputs":[{"Node":{"node_id":1791308547102433540,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":800.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::ImpureMemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16943732999059587742,{"inputs":[{"Node":{"node_id":10202767637947785546,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.399999999999956},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[1801066723091712434,{"inputs":[{"Value":{"tagged_value":"None","exposed":true}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.21176471,"green":0.21568628,"blue":0.23137255,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"F64":1744.31393592},"exposed":false}},{"Value":{"tagged_value":{"F64":63.0},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2288754089236120499,"output_index":0,"lambda":false}}],"nodes":[[11731553664207576737,{"inputs":[{"Node":{"node_id":5663116427189655422,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":48.900000000000006},"exposed":false}},{"Node":{"node_id":7828034197076821310,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[14158287945315818946,{"inputs":[{"Node":{"node_id":16943732999059587742,"output_index":0,"lambda":false}},{"Node":{"node_id":14577956936089455769,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.6181095265062186,3.496297826945966]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.4855225354961647,0.31002285853371414]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2288754089236120499,{"inputs":[{"Node":{"node_id":14158287945315818946,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SplineNode"}},"visible":true,"skip_deduplication":false}],[10202767637947785546,{"inputs":[{"Node":{"node_id":11731553664207576737,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":172.90000000000003},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::ImpureMemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7828034197076821310,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":3}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::ToU32Node"}},"visible":true,"skip_deduplication":false}],[640915213983348287,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":4000.0},"exposed":false}},{"Value":{"tagged_value":{"F64":500.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::generator_nodes::RectangleNode"}},"visible":true,"skip_deduplication":false}],[1791308547102433540,{"inputs":[{"Node":{"node_id":640915213983348287,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":1}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.99607843,"green":0.827451,"blue":0.65882355,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14577956936089455769,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":1050.10498991},"exposed":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":2}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::CoordinateValueNode"}},"visible":true,"skip_deduplication":false}],[5663116427189655422,{"inputs":[{"Node":{"node_id":1791308547102433540,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":800.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::ImpureMemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16943732999059587742,{"inputs":[{"Node":{"node_id":10202767637947785546,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.399999999999956},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[12317719117993811200,{"inputs":[{"Node":{"node_id":9069881382900058607,"output_index":0,"lambda":false}},{"Node":{"node_id":17239043462037837834,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[8804763001225416124,{"inputs":[{"Node":{"node_id":3934928477288442109,"output_index":0,"lambda":false}},{"Node":{"node_id":17154757625902243313,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[17239043462037837834,{"inputs":[{"Value":{"tagged_value":"None","exposed":true}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8039216,"green":0.6627451,"blue":0.52156866,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"F64":1447.11050605},"exposed":false}},{"Value":{"tagged_value":{"F64":309.0},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2288754089236120499,"output_index":0,"lambda":false}}],"nodes":[[11731553664207576737,{"inputs":[{"Node":{"node_id":5663116427189655422,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":48.900000000000006},"exposed":false}},{"Node":{"node_id":7828034197076821310,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[14158287945315818946,{"inputs":[{"Node":{"node_id":16943732999059587742,"output_index":0,"lambda":false}},{"Node":{"node_id":14577956936089455769,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.6181095265062186,3.496297826945966]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.4855225354961647,0.31002285853371414]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2288754089236120499,{"inputs":[{"Node":{"node_id":14158287945315818946,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SplineNode"}},"visible":true,"skip_deduplication":false}],[10202767637947785546,{"inputs":[{"Node":{"node_id":11731553664207576737,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":172.90000000000003},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::ImpureMemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7828034197076821310,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":3}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::ToU32Node"}},"visible":true,"skip_deduplication":false}],[640915213983348287,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":4000.0},"exposed":false}},{"Value":{"tagged_value":{"F64":500.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::generator_nodes::RectangleNode"}},"visible":true,"skip_deduplication":false}],[1791308547102433540,{"inputs":[{"Node":{"node_id":640915213983348287,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":1}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.99607843,"green":0.827451,"blue":0.65882355,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14577956936089455769,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":1050.10498991},"exposed":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":2}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::CoordinateValueNode"}},"visible":true,"skip_deduplication":false}],[5663116427189655422,{"inputs":[{"Node":{"node_id":1791308547102433540,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":800.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::ImpureMemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16943732999059587742,{"inputs":[{"Node":{"node_id":10202767637947785546,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.399999999999956},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2128810469968776913,{"inputs":[{"Value":{"tagged_value":{"GraphicGroup":{"instance":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":12416569579970107543,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[239716716021064150,{"inputs":[{"Value":{"tagged_value":{"GraphicGroup":{"instance":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":7711570794020903773,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15385259560644295534,{"inputs":[{"Node":{"node_id":17327221498641745184,"output_index":0,"lambda":false}},{"Node":{"node_id":3726756269632080543,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4445985685181725042,{"inputs":[{"Value":{"tagged_value":{"ArtboardGroup":{"instance":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":13132104524813958174,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"IVec2":[0,0]},"exposed":false}},{"Value":{"tagged_value":{"IVec2":[2000,1000]},"exposed":false}},{"Value":{"tagged_value":{"Color":{"red":0.99607843,"green":0.8745098,"blue":0.7019608,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graph_craft::document::value::TaggedValue","alias":null}},"import_index":1}},{"Value":{"tagged_value":{"String":"Artboard"},"exposed":false}},{"Network":{"import_type":{"Concrete":{"name":"graph_craft::document::value::TaggedValue","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"graph_craft::document::value::TaggedValue","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"graph_craft::document::value::TaggedValue","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"graph_craft::document::value::TaggedValue","alias":null}},"import_index":5}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToArtboardNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Network":{"import_type":{"Fn":[{"Concrete":{"name":"core::option::Option>","alias":null}},{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}}]},"import_index":0}},{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::AppendArtboardNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[12122314434656187176,{"inputs":[{"Node":{"node_id":10686861494573327243,"output_index":0,"lambda":false}},{"Node":{"node_id":16611856724057842399,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13676600738025998635,{"inputs":[{"Node":{"node_id":2128810469968776913,"output_index":0,"lambda":false}},{"Node":{"node_id":6097807941755042226,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[6097807941755042226,{"inputs":[{"Node":{"node_id":15385259560644295534,"output_index":0,"lambda":false}},{"Node":{"node_id":5883606306991910210,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[17437077810654043142,{"inputs":[{"Node":{"node_id":15002088321732485705,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":40.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]},"network_metadata":{"persistent_metadata":{"node_metadata":[[15385259560644295534,{"persistent_metadata":{"reference":"Merge","display_name":"Dune 2","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":["Out"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[3934928477288442109,{"persistent_metadata":{"reference":"Merge","display_name":"Dune 1","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":["Out"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[7128559142392931896,{"persistent_metadata":{"reference":null,"display_name":"Dune","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":"Color"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":[""],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1791308547102433540,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-20,-3]}}},"network_metadata":null}}],[2288754089236120499,{"persistent_metadata":{"reference":"Spline","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[22,-3]}}},"network_metadata":null}}],[7828034197076821310,{"persistent_metadata":{"reference":"To u32","display_name":"","input_properties":[{"input_data":{"input_name":"Value"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,1]}}},"network_metadata":null}}],[10202767637947785546,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"is_integer":false,"blank_assist":true,"input_name":"Spacing","mode":"Increment","min":1.0,"unit":" px","tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)"},"widget_override":"number"},{"input_data":{"min":0.0,"is_integer":false,"blank_assist":true,"input_name":"Start Offset","mode":"Increment","tooltip":"Exclude some distance from the start of the path before the first instance","unit":" px"},"widget_override":"number"},{"input_data":{"input_name":"Stop Offset","tooltip":"Exclude some distance from the end of the path after the last instance","is_integer":false,"min":0.0,"unit":" px","blank_assist":true,"mode":"Increment"},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize Impure","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[5663116427189655422,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"blank_assist":true,"unit":" px","input_name":"Spacing","is_integer":false,"min":1.0,"mode":"Increment","tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)"},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"mode":"Increment","tooltip":"Exclude some distance from the start of the path before the first instance","input_name":"Start Offset","min":0.0,"unit":" px"},"widget_override":"number"},{"input_data":{"min":0.0,"input_name":"Stop Offset","blank_assist":true,"is_integer":false,"mode":"Increment","tooltip":"Exclude some distance from the end of the path after the last instance","unit":" px"},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize Impure","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[640915213983348287,{"persistent_metadata":{"reference":"Rectangle","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"Width"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Individual Corner Radii"},"widget_override":null},{"input_data":{"input_name":"Corner Radius"},"widget_override":null},{"input_data":{"input_name":"Clamped"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-27,-3]}}},"network_metadata":null}}],[14158287945315818946,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Translation","x":"X","y":"Y","unit":" px"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"unit":"x","input_name":"Scale","x":"W","y":"H"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"transform_skew"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":["Data"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[15,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14577956936089455769,{"persistent_metadata":{"reference":"Coordinate Value","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"X"},"widget_override":null},{"input_data":{"input_name":"Y"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-1]}}},"network_metadata":null}}],[11731553664207576737,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-6,-3]}}},"network_metadata":null}}],[16943732999059587742,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,991.0,581.0],"node_graph_top_right":[1980.796875,0.0]},"selection_undo_history":[[]],"selection_redo_history":[]}}}}],[9069881382900058607,{"persistent_metadata":{"reference":"Merge","display_name":"Dune 5","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":["Out"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4037968351431607570,{"persistent_metadata":{"reference":null,"display_name":"Dune","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":"Color"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":[""],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[14158287945315818946,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"x":"X","y":"Y","unit":" px","input_name":"Translation"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"x":"W","y":"H","unit":"x","input_name":"Scale"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"transform_skew"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":["Data"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[15,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[5663116427189655422,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Spacing","mode":"Increment","tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","unit":" px","is_integer":false,"blank_assist":true,"min":1.0},"widget_override":"number"},{"input_data":{"blank_assist":true,"tooltip":"Exclude some distance from the start of the path before the first instance","mode":"Increment","input_name":"Start Offset","min":0.0,"unit":" px","is_integer":false},"widget_override":"number"},{"input_data":{"blank_assist":true,"input_name":"Stop Offset","min":0.0,"is_integer":false,"mode":"Increment","tooltip":"Exclude some distance from the end of the path after the last instance","unit":" px"},"widget_override":"number"},{"input_data":{"tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly","input_name":"Adaptive Spacing"},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize Impure","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10202767637947785546,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Spacing","min":1.0,"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","unit":" px","mode":"Increment","is_integer":false,"blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"input_name":"Start Offset","unit":" px","blank_assist":true,"min":0.0,"mode":"Increment","tooltip":"Exclude some distance from the start of the path before the first instance"},"widget_override":"number"},{"input_data":{"is_integer":false,"min":0.0,"mode":"Increment","unit":" px","blank_assist":true,"input_name":"Stop Offset","tooltip":"Exclude some distance from the end of the path after the last instance"},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize Impure","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11731553664207576737,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-6,-3]}}},"network_metadata":null}}],[14577956936089455769,{"persistent_metadata":{"reference":"Coordinate Value","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"X"},"widget_override":null},{"input_data":{"input_name":"Y"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-1]}}},"network_metadata":null}}],[2288754089236120499,{"persistent_metadata":{"reference":"Spline","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[22,-3]}}},"network_metadata":null}}],[640915213983348287,{"persistent_metadata":{"reference":"Rectangle","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"Width"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Individual Corner Radii"},"widget_override":null},{"input_data":{"input_name":"Corner Radius"},"widget_override":null},{"input_data":{"input_name":"Clamped"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-27,-3]}}},"network_metadata":null}}],[16943732999059587742,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-3]}}},"network_metadata":null}}],[1791308547102433540,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-20,-3]}}},"network_metadata":null}}],[7828034197076821310,{"persistent_metadata":{"reference":"To u32","display_name":"","input_properties":[{"input_data":{"input_name":"Value"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,991.0,581.0],"node_graph_top_right":[1980.796875,0.0]},"selection_undo_history":[[]],"selection_redo_history":[]}}}}],[2163528024003768644,{"persistent_metadata":{"reference":"Merge","display_name":"Dune in Shadow 1","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":["Out"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Absolute":[-14,6]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[17154757625902243313,{"persistent_metadata":{"reference":null,"display_name":"Dune","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":"Color"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":[""],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[14577956936089455769,{"persistent_metadata":{"reference":"Coordinate Value","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"X"},"widget_override":null},{"input_data":{"input_name":"Y"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-1]}}},"network_metadata":null}}],[2288754089236120499,{"persistent_metadata":{"reference":"Spline","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[22,-3]}}},"network_metadata":null}}],[5663116427189655422,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","unit":" px","blank_assist":true,"min":1.0,"input_name":"Spacing","is_integer":false,"mode":"Increment"},"widget_override":"number"},{"input_data":{"input_name":"Start Offset","is_integer":false,"blank_assist":true,"tooltip":"Exclude some distance from the start of the path before the first instance","min":0.0,"mode":"Increment","unit":" px"},"widget_override":"number"},{"input_data":{"blank_assist":true,"is_integer":false,"unit":" px","mode":"Increment","input_name":"Stop Offset","min":0.0,"tooltip":"Exclude some distance from the end of the path after the last instance"},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize Impure","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10202767637947785546,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"blank_assist":true,"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","is_integer":false,"min":1.0,"mode":"Increment","unit":" px","input_name":"Spacing"},"widget_override":"number"},{"input_data":{"blank_assist":true,"is_integer":false,"tooltip":"Exclude some distance from the start of the path before the first instance","unit":" px","input_name":"Start Offset","min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{"input_name":"Stop Offset","unit":" px","is_integer":false,"mode":"Increment","blank_assist":true,"min":0.0,"tooltip":"Exclude some distance from the end of the path after the last instance"},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize Impure","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16943732999059587742,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-3]}}},"network_metadata":null}}],[1791308547102433540,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-20,-3]}}},"network_metadata":null}}],[7828034197076821310,{"persistent_metadata":{"reference":"To u32","display_name":"","input_properties":[{"input_data":{"input_name":"Value"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,1]}}},"network_metadata":null}}],[11731553664207576737,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-6,-3]}}},"network_metadata":null}}],[640915213983348287,{"persistent_metadata":{"reference":"Rectangle","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"Width"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Individual Corner Radii"},"widget_override":null},{"input_data":{"input_name":"Corner Radius"},"widget_override":null},{"input_data":{"input_name":"Clamped"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-27,-3]}}},"network_metadata":null}}],[14158287945315818946,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"y":"Y","input_name":"Translation","unit":" px","x":"X"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"y":"H","unit":"x","x":"W","input_name":"Scale"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"transform_skew"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":["Data"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[15,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,991.0,581.0],"node_graph_top_right":[1980.796875,0.0]},"selection_undo_history":[[]],"selection_redo_history":[]}}}}],[13676600738025998635,{"persistent_metadata":{"reference":"Merge","display_name":"Background","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":["Out"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":10}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15002088321732485705,{"persistent_metadata":{"reference":null,"display_name":"Dune","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":"Color"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":[""],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[14577956936089455769,{"persistent_metadata":{"reference":"Coordinate Value","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"X"},"widget_override":null},{"input_data":{"input_name":"Y"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-1]}}},"network_metadata":null}}],[1791308547102433540,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-20,-3]}}},"network_metadata":null}}],[11731553664207576737,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-6,-3]}}},"network_metadata":null}}],[5663116427189655422,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","min":1.0,"unit":" px","is_integer":false,"blank_assist":true,"input_name":"Spacing","mode":"Increment"},"widget_override":"number"},{"input_data":{"min":0.0,"mode":"Increment","input_name":"Start Offset","unit":" px","tooltip":"Exclude some distance from the start of the path before the first instance","is_integer":false,"blank_assist":true},"widget_override":"number"},{"input_data":{"mode":"Increment","blank_assist":true,"is_integer":false,"min":0.0,"input_name":"Stop Offset","tooltip":"Exclude some distance from the end of the path after the last instance","unit":" px"},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize Impure","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[7828034197076821310,{"persistent_metadata":{"reference":"To u32","display_name":"","input_properties":[{"input_data":{"input_name":"Value"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,1]}}},"network_metadata":null}}],[16943732999059587742,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-3]}}},"network_metadata":null}}],[2288754089236120499,{"persistent_metadata":{"reference":"Spline","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[22,-3]}}},"network_metadata":null}}],[640915213983348287,{"persistent_metadata":{"reference":"Rectangle","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"Width"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Individual Corner Radii"},"widget_override":null},{"input_data":{"input_name":"Corner Radius"},"widget_override":null},{"input_data":{"input_name":"Clamped"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-27,-3]}}},"network_metadata":null}}],[10202767637947785546,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"unit":" px","blank_assist":true,"input_name":"Spacing","is_integer":false,"min":1.0,"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","mode":"Increment"},"widget_override":"number"},{"input_data":{"unit":" px","input_name":"Start Offset","is_integer":false,"mode":"Increment","blank_assist":true,"min":0.0,"tooltip":"Exclude some distance from the start of the path before the first instance"},"widget_override":"number"},{"input_data":{"is_integer":false,"min":0.0,"mode":"Increment","unit":" px","tooltip":"Exclude some distance from the end of the path after the last instance","blank_assist":true,"input_name":"Stop Offset"},"widget_override":"number"},{"input_data":{"tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly","input_name":"Adaptive Spacing"},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize Impure","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14158287945315818946,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Translation","unit":" px","x":"X","y":"Y"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"input_name":"Scale","x":"W","unit":"x","y":"H"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"transform_skew"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":["Data"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[15,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,991.0,581.0],"node_graph_top_right":[1980.796875,0.0]},"selection_undo_history":[[]],"selection_redo_history":[]}}}}],[3683309254695891012,{"persistent_metadata":{"reference":null,"display_name":"Dune","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":"Color"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":[""],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2288754089236120499,{"persistent_metadata":{"reference":"Spline","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[22,-3]}}},"network_metadata":null}}],[16943732999059587742,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-3]}}},"network_metadata":null}}],[5663116427189655422,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"blank_assist":true,"is_integer":false,"min":1.0,"input_name":"Spacing","mode":"Increment","tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","unit":" px"},"widget_override":"number"},{"input_data":{"mode":"Increment","unit":" px","input_name":"Start Offset","tooltip":"Exclude some distance from the start of the path before the first instance","is_integer":false,"blank_assist":true,"min":0.0},"widget_override":"number"},{"input_data":{"input_name":"Stop Offset","tooltip":"Exclude some distance from the end of the path after the last instance","unit":" px","blank_assist":true,"is_integer":false,"mode":"Increment","min":0.0},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize Impure","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[7828034197076821310,{"persistent_metadata":{"reference":"To u32","display_name":"","input_properties":[{"input_data":{"input_name":"Value"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,1]}}},"network_metadata":null}}],[640915213983348287,{"persistent_metadata":{"reference":"Rectangle","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"Width"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Individual Corner Radii"},"widget_override":null},{"input_data":{"input_name":"Corner Radius"},"widget_override":null},{"input_data":{"input_name":"Clamped"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-27,-3]}}},"network_metadata":null}}],[1791308547102433540,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-20,-3]}}},"network_metadata":null}}],[14158287945315818946,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Translation","unit":" px","x":"X","y":"Y"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"unit":"x","input_name":"Scale","x":"W","y":"H"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"transform_skew"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":["Data"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[15,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14577956936089455769,{"persistent_metadata":{"reference":"Coordinate Value","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"X"},"widget_override":null},{"input_data":{"input_name":"Y"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-1]}}},"network_metadata":null}}],[10202767637947785546,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Spacing","is_integer":false,"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","min":1.0,"unit":" px","blank_assist":true,"mode":"Increment"},"widget_override":"number"},{"input_data":{"input_name":"Start Offset","unit":" px","min":0.0,"blank_assist":true,"mode":"Increment","tooltip":"Exclude some distance from the start of the path before the first instance","is_integer":false},"widget_override":"number"},{"input_data":{"min":0.0,"is_integer":false,"blank_assist":true,"mode":"Increment","tooltip":"Exclude some distance from the end of the path after the last instance","unit":" px","input_name":"Stop Offset"},"widget_override":"number"},{"input_data":{"tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly","input_name":"Adaptive Spacing"},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize Impure","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11731553664207576737,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-6,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,991.0,581.0],"node_graph_top_right":[1980.796875,0.0]},"selection_undo_history":[[]],"selection_redo_history":[]}}}}],[13132104524813958174,{"persistent_metadata":{"reference":"Merge","display_name":"Foreground","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":["Out"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Absolute":[-4,3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[17327221498641745184,{"persistent_metadata":{"reference":"Merge","display_name":"Dune 3","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":["Out"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[5883606306991910210,{"persistent_metadata":{"reference":null,"display_name":"Dune","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":"Color"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":[""],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1791308547102433540,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-20,-3]}}},"network_metadata":null}}],[11731553664207576737,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-6,-3]}}},"network_metadata":null}}],[640915213983348287,{"persistent_metadata":{"reference":"Rectangle","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"Width"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Individual Corner Radii"},"widget_override":null},{"input_data":{"input_name":"Corner Radius"},"widget_override":null},{"input_data":{"input_name":"Clamped"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-27,-3]}}},"network_metadata":null}}],[14577956936089455769,{"persistent_metadata":{"reference":"Coordinate Value","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"X"},"widget_override":null},{"input_data":{"input_name":"Y"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-1]}}},"network_metadata":null}}],[7828034197076821310,{"persistent_metadata":{"reference":"To u32","display_name":"","input_properties":[{"input_data":{"input_name":"Value"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,1]}}},"network_metadata":null}}],[16943732999059587742,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-3]}}},"network_metadata":null}}],[5663116427189655422,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"mode":"Increment","unit":" px","input_name":"Spacing","tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","blank_assist":true,"is_integer":false,"min":1.0},"widget_override":"number"},{"input_data":{"blank_assist":true,"input_name":"Start Offset","mode":"Increment","unit":" px","tooltip":"Exclude some distance from the start of the path before the first instance","is_integer":false,"min":0.0},"widget_override":"number"},{"input_data":{"tooltip":"Exclude some distance from the end of the path after the last instance","unit":" px","blank_assist":true,"input_name":"Stop Offset","is_integer":false,"min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize Impure","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14158287945315818946,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"unit":" px","y":"Y","x":"X","input_name":"Translation"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"x":"W","unit":"x","input_name":"Scale","y":"H"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"transform_skew"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":["Data"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[15,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10202767637947785546,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"blank_assist":true,"input_name":"Spacing","is_integer":false,"min":1.0,"mode":"Increment","tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","unit":" px"},"widget_override":"number"},{"input_data":{"unit":" px","is_integer":false,"input_name":"Start Offset","tooltip":"Exclude some distance from the start of the path before the first instance","min":0.0,"blank_assist":true,"mode":"Increment"},"widget_override":"number"},{"input_data":{"mode":"Increment","is_integer":false,"unit":" px","blank_assist":true,"input_name":"Stop Offset","min":0.0,"tooltip":"Exclude some distance from the end of the path after the last instance"},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize Impure","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2288754089236120499,{"persistent_metadata":{"reference":"Spline","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[22,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,991.0,581.0],"node_graph_top_right":[1980.796875,0.0]},"selection_undo_history":[[]],"selection_redo_history":[]}}}}],[239716716021064150,{"persistent_metadata":{"reference":"Merge","display_name":"Dune 2","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":["Out"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[3726756269632080543,{"persistent_metadata":{"reference":null,"display_name":"Dune","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":"Color"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":[""],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1791308547102433540,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-20,-3]}}},"network_metadata":null}}],[14158287945315818946,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"y":"Y","input_name":"Translation","x":"X","unit":" px"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"input_name":"Scale","unit":"x","y":"H","x":"W"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"transform_skew"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":["Data"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[15,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2288754089236120499,{"persistent_metadata":{"reference":"Spline","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[22,-3]}}},"network_metadata":null}}],[16943732999059587742,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-3]}}},"network_metadata":null}}],[5663116427189655422,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"min":1.0,"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","input_name":"Spacing","unit":" px","is_integer":false,"blank_assist":true,"mode":"Increment"},"widget_override":"number"},{"input_data":{"tooltip":"Exclude some distance from the start of the path before the first instance","input_name":"Start Offset","is_integer":false,"blank_assist":true,"min":0.0,"mode":"Increment","unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":false,"tooltip":"Exclude some distance from the end of the path after the last instance","mode":"Increment","blank_assist":true,"min":0.0,"unit":" px","input_name":"Stop Offset"},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize Impure","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14577956936089455769,{"persistent_metadata":{"reference":"Coordinate Value","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"X"},"widget_override":null},{"input_data":{"input_name":"Y"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-1]}}},"network_metadata":null}}],[640915213983348287,{"persistent_metadata":{"reference":"Rectangle","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"Width"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Individual Corner Radii"},"widget_override":null},{"input_data":{"input_name":"Corner Radius"},"widget_override":null},{"input_data":{"input_name":"Clamped"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-27,-3]}}},"network_metadata":null}}],[10202767637947785546,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","is_integer":false,"input_name":"Spacing","mode":"Increment","unit":" px","blank_assist":true,"min":1.0},"widget_override":"number"},{"input_data":{"is_integer":false,"min":0.0,"input_name":"Start Offset","blank_assist":true,"mode":"Increment","tooltip":"Exclude some distance from the start of the path before the first instance","unit":" px"},"widget_override":"number"},{"input_data":{"min":0.0,"tooltip":"Exclude some distance from the end of the path after the last instance","unit":" px","is_integer":false,"mode":"Increment","blank_assist":true,"input_name":"Stop Offset"},"widget_override":"number"},{"input_data":{"tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly","input_name":"Adaptive Spacing"},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize Impure","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11731553664207576737,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-6,-3]}}},"network_metadata":null}}],[7828034197076821310,{"persistent_metadata":{"reference":"To u32","display_name":"","input_properties":[{"input_data":{"input_name":"Value"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,991.0,581.0],"node_graph_top_right":[1980.796875,0.0]},"selection_undo_history":[[]],"selection_redo_history":[]}}}}],[6523786079462141312,{"persistent_metadata":{"reference":null,"display_name":"Dune","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":"Color"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":[""],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[5663116427189655422,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"blank_assist":true,"is_integer":false,"min":1.0,"mode":"Increment","tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","unit":" px","input_name":"Spacing"},"widget_override":"number"},{"input_data":{"tooltip":"Exclude some distance from the start of the path before the first instance","min":0.0,"input_name":"Start Offset","is_integer":false,"mode":"Increment","blank_assist":true,"unit":" px"},"widget_override":"number"},{"input_data":{"tooltip":"Exclude some distance from the end of the path after the last instance","unit":" px","blank_assist":true,"is_integer":false,"input_name":"Stop Offset","min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize Impure","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16943732999059587742,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-3]}}},"network_metadata":null}}],[640915213983348287,{"persistent_metadata":{"reference":"Rectangle","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"Width"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Individual Corner Radii"},"widget_override":null},{"input_data":{"input_name":"Corner Radius"},"widget_override":null},{"input_data":{"input_name":"Clamped"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-27,-3]}}},"network_metadata":null}}],[1791308547102433540,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-20,-3]}}},"network_metadata":null}}],[2288754089236120499,{"persistent_metadata":{"reference":"Spline","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[22,-3]}}},"network_metadata":null}}],[11731553664207576737,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-6,-3]}}},"network_metadata":null}}],[7828034197076821310,{"persistent_metadata":{"reference":"To u32","display_name":"","input_properties":[{"input_data":{"input_name":"Value"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,1]}}},"network_metadata":null}}],[14577956936089455769,{"persistent_metadata":{"reference":"Coordinate Value","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"X"},"widget_override":null},{"input_data":{"input_name":"Y"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-1]}}},"network_metadata":null}}],[14158287945315818946,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Translation","x":"X","unit":" px","y":"Y"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"x":"W","y":"H","input_name":"Scale","unit":"x"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"transform_skew"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":["Data"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[15,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10202767637947785546,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"mode":"Increment","is_integer":false,"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","input_name":"Spacing","min":1.0,"unit":" px","blank_assist":true},"widget_override":"number"},{"input_data":{"tooltip":"Exclude some distance from the start of the path before the first instance","min":0.0,"is_integer":false,"unit":" px","mode":"Increment","blank_assist":true,"input_name":"Start Offset"},"widget_override":"number"},{"input_data":{"input_name":"Stop Offset","mode":"Increment","is_integer":false,"tooltip":"Exclude some distance from the end of the path after the last instance","unit":" px","min":0.0,"blank_assist":true},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize Impure","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,991.0,581.0],"node_graph_top_right":[1980.796875,0.0]},"selection_undo_history":[[]],"selection_redo_history":[]}}}}],[10686861494573327243,{"persistent_metadata":{"reference":"Merge","display_name":"Dune in Shadow 2","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":["Out"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[7711570794020903773,{"persistent_metadata":{"reference":null,"display_name":"Dune","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":"Color"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":[""],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[5663116427189655422,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Spacing","mode":"Increment","unit":" px","min":1.0,"is_integer":false,"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","blank_assist":true},"widget_override":"number"},{"input_data":{"min":0.0,"unit":" px","is_integer":false,"mode":"Increment","input_name":"Start Offset","blank_assist":true,"tooltip":"Exclude some distance from the start of the path before the first instance"},"widget_override":"number"},{"input_data":{"unit":" px","min":0.0,"tooltip":"Exclude some distance from the end of the path after the last instance","is_integer":false,"blank_assist":true,"input_name":"Stop Offset","mode":"Increment"},"widget_override":"number"},{"input_data":{"tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly","input_name":"Adaptive Spacing"},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize Impure","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[640915213983348287,{"persistent_metadata":{"reference":"Rectangle","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"Width"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Individual Corner Radii"},"widget_override":null},{"input_data":{"input_name":"Corner Radius"},"widget_override":null},{"input_data":{"input_name":"Clamped"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-27,-3]}}},"network_metadata":null}}],[11731553664207576737,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-6,-3]}}},"network_metadata":null}}],[1791308547102433540,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-20,-3]}}},"network_metadata":null}}],[7828034197076821310,{"persistent_metadata":{"reference":"To u32","display_name":"","input_properties":[{"input_data":{"input_name":"Value"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,1]}}},"network_metadata":null}}],[14158287945315818946,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"unit":" px","y":"Y","x":"X","input_name":"Translation"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"x":"W","input_name":"Scale","unit":"x","y":"H"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"transform_skew"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":["Data"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[15,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14577956936089455769,{"persistent_metadata":{"reference":"Coordinate Value","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"X"},"widget_override":null},{"input_data":{"input_name":"Y"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-1]}}},"network_metadata":null}}],[2288754089236120499,{"persistent_metadata":{"reference":"Spline","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[22,-3]}}},"network_metadata":null}}],[16943732999059587742,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-3]}}},"network_metadata":null}}],[10202767637947785546,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Spacing","blank_assist":true,"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","min":1.0,"mode":"Increment","is_integer":false,"unit":" px"},"widget_override":"number"},{"input_data":{"mode":"Increment","input_name":"Start Offset","tooltip":"Exclude some distance from the start of the path before the first instance","unit":" px","min":0.0,"blank_assist":true,"is_integer":false},"widget_override":"number"},{"input_data":{"blank_assist":true,"is_integer":false,"input_name":"Stop Offset","min":0.0,"mode":"Increment","tooltip":"Exclude some distance from the end of the path after the last instance","unit":" px"},"widget_override":"number"},{"input_data":{"tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly","input_name":"Adaptive Spacing"},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize Impure","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,991.0,581.0],"node_graph_top_right":[1980.796875,0.0]},"selection_undo_history":[[]],"selection_redo_history":[]}}}}],[8804763001225416124,{"persistent_metadata":{"reference":"Merge","display_name":"Dune in Shadow 4","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":["Out"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10806978668166337270,{"persistent_metadata":{"reference":null,"display_name":"Dune","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":"Color"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":[""],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[14158287945315818946,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"y":"Y","input_name":"Translation","unit":" px","x":"X"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"unit":"x","input_name":"Scale","x":"W","y":"H"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"transform_skew"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":["Data"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[15,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[1791308547102433540,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-20,-3]}}},"network_metadata":null}}],[16943732999059587742,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-3]}}},"network_metadata":null}}],[7828034197076821310,{"persistent_metadata":{"reference":"To u32","display_name":"","input_properties":[{"input_data":{"input_name":"Value"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,1]}}},"network_metadata":null}}],[11731553664207576737,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-6,-3]}}},"network_metadata":null}}],[640915213983348287,{"persistent_metadata":{"reference":"Rectangle","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"Width"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Individual Corner Radii"},"widget_override":null},{"input_data":{"input_name":"Corner Radius"},"widget_override":null},{"input_data":{"input_name":"Clamped"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-27,-3]}}},"network_metadata":null}}],[2288754089236120499,{"persistent_metadata":{"reference":"Spline","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[22,-3]}}},"network_metadata":null}}],[10202767637947785546,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"is_integer":false,"min":1.0,"input_name":"Spacing","tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","mode":"Increment","unit":" px","blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"input_name":"Start Offset","unit":" px","tooltip":"Exclude some distance from the start of the path before the first instance","mode":"Increment","min":0.0,"blank_assist":true},"widget_override":"number"},{"input_data":{"mode":"Increment","blank_assist":true,"tooltip":"Exclude some distance from the end of the path after the last instance","unit":" px","input_name":"Stop Offset","is_integer":false,"min":0.0},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize Impure","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14577956936089455769,{"persistent_metadata":{"reference":"Coordinate Value","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"X"},"widget_override":null},{"input_data":{"input_name":"Y"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-1]}}},"network_metadata":null}}],[5663116427189655422,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Spacing","is_integer":false,"blank_assist":true,"mode":"Increment","min":1.0,"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","unit":" px"},"widget_override":"number"},{"input_data":{"unit":" px","tooltip":"Exclude some distance from the start of the path before the first instance","blank_assist":true,"mode":"Increment","input_name":"Start Offset","is_integer":false,"min":0.0},"widget_override":"number"},{"input_data":{"blank_assist":true,"is_integer":false,"min":0.0,"mode":"Increment","tooltip":"Exclude some distance from the end of the path after the last instance","input_name":"Stop Offset","unit":" px"},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize Impure","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,991.0,581.0],"node_graph_top_right":[1980.796875,0.0]},"selection_undo_history":[[]],"selection_redo_history":[]}}}}],[17589660903986237301,{"persistent_metadata":{"reference":null,"display_name":"Dune","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":"Color"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":[""],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2288754089236120499,{"persistent_metadata":{"reference":"Spline","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[22,-3]}}},"network_metadata":null}}],[1791308547102433540,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-20,-3]}}},"network_metadata":null}}],[11731553664207576737,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-6,-3]}}},"network_metadata":null}}],[10202767637947785546,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"min":1.0,"is_integer":false,"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","unit":" px","blank_assist":true,"input_name":"Spacing","mode":"Increment"},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"tooltip":"Exclude some distance from the start of the path before the first instance","input_name":"Start Offset","min":0.0,"unit":" px","mode":"Increment"},"widget_override":"number"},{"input_data":{"blank_assist":true,"min":0.0,"tooltip":"Exclude some distance from the end of the path after the last instance","is_integer":false,"mode":"Increment","unit":" px","input_name":"Stop Offset"},"widget_override":"number"},{"input_data":{"tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly","input_name":"Adaptive Spacing"},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize Impure","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14158287945315818946,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Translation","unit":" px","y":"Y","x":"X"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"input_name":"Scale","y":"H","unit":"x","x":"W"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"transform_skew"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":["Data"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[15,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[640915213983348287,{"persistent_metadata":{"reference":"Rectangle","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"Width"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Individual Corner Radii"},"widget_override":null},{"input_data":{"input_name":"Corner Radius"},"widget_override":null},{"input_data":{"input_name":"Clamped"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-27,-3]}}},"network_metadata":null}}],[14577956936089455769,{"persistent_metadata":{"reference":"Coordinate Value","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"X"},"widget_override":null},{"input_data":{"input_name":"Y"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-1]}}},"network_metadata":null}}],[5663116427189655422,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"mode":"Increment","min":1.0,"is_integer":false,"unit":" px","blank_assist":true,"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","input_name":"Spacing"},"widget_override":"number"},{"input_data":{"unit":" px","is_integer":false,"mode":"Increment","input_name":"Start Offset","blank_assist":true,"min":0.0,"tooltip":"Exclude some distance from the start of the path before the first instance"},"widget_override":"number"},{"input_data":{"unit":" px","is_integer":false,"min":0.0,"mode":"Increment","blank_assist":true,"tooltip":"Exclude some distance from the end of the path after the last instance","input_name":"Stop Offset"},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize Impure","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[7828034197076821310,{"persistent_metadata":{"reference":"To u32","display_name":"","input_properties":[{"input_data":{"input_name":"Value"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,1]}}},"network_metadata":null}}],[16943732999059587742,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,991.0,581.0],"node_graph_top_right":[1980.796875,0.0]},"selection_undo_history":[[]],"selection_redo_history":[]}}}}],[13323241418027154136,{"persistent_metadata":{"reference":null,"display_name":"Dune","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":"Color"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":[""],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[14158287945315818946,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"unit":" px","y":"Y","x":"X","input_name":"Translation"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"x":"W","input_name":"Scale","y":"H","unit":"x"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"transform_skew"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":["Data"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[15,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16943732999059587742,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-3]}}},"network_metadata":null}}],[11731553664207576737,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-6,-3]}}},"network_metadata":null}}],[10202767637947785546,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"blank_assist":true,"input_name":"Spacing","min":1.0,"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","is_integer":false,"mode":"Increment","unit":" px"},"widget_override":"number"},{"input_data":{"blank_assist":true,"input_name":"Start Offset","unit":" px","is_integer":false,"min":0.0,"mode":"Increment","tooltip":"Exclude some distance from the start of the path before the first instance"},"widget_override":"number"},{"input_data":{"mode":"Increment","min":0.0,"tooltip":"Exclude some distance from the end of the path after the last instance","unit":" px","is_integer":false,"blank_assist":true,"input_name":"Stop Offset"},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize Impure","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[5663116427189655422,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","unit":" px","blank_assist":true,"is_integer":false,"min":1.0,"mode":"Increment","input_name":"Spacing"},"widget_override":"number"},{"input_data":{"is_integer":false,"tooltip":"Exclude some distance from the start of the path before the first instance","unit":" px","blank_assist":true,"min":0.0,"input_name":"Start Offset","mode":"Increment"},"widget_override":"number"},{"input_data":{"mode":"Increment","min":0.0,"input_name":"Stop Offset","tooltip":"Exclude some distance from the end of the path after the last instance","blank_assist":true,"unit":" px","is_integer":false},"widget_override":"number"},{"input_data":{"tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly","input_name":"Adaptive Spacing"},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize Impure","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[640915213983348287,{"persistent_metadata":{"reference":"Rectangle","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"Width"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Individual Corner Radii"},"widget_override":null},{"input_data":{"input_name":"Corner Radius"},"widget_override":null},{"input_data":{"input_name":"Clamped"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-27,-3]}}},"network_metadata":null}}],[14577956936089455769,{"persistent_metadata":{"reference":"Coordinate Value","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"X"},"widget_override":null},{"input_data":{"input_name":"Y"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-1]}}},"network_metadata":null}}],[7828034197076821310,{"persistent_metadata":{"reference":"To u32","display_name":"","input_properties":[{"input_data":{"input_name":"Value"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,1]}}},"network_metadata":null}}],[2288754089236120499,{"persistent_metadata":{"reference":"Spline","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[22,-3]}}},"network_metadata":null}}],[1791308547102433540,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-20,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,991.0,581.0],"node_graph_top_right":[1980.796875,0.0]},"selection_undo_history":[[]],"selection_redo_history":[]}}}}],[4445985685181725042,{"persistent_metadata":{"reference":"Artboard","display_name":"","input_properties":[{"input_data":{"input_name":"Artboards"},"widget_override":null},{"input_data":{"input_name":"Contents"},"widget_override":"hidden"},{"input_data":{"y":"Y","unit":" px","x":"X","input_name":"Location"},"widget_override":"vec2"},{"input_data":{"x":"W","y":"H","unit":" px","input_name":"Dimensions"},"widget_override":"vec2"},{"input_data":{"input_name":"Background"},"widget_override":"artboard_background"},{"input_data":{"input_name":"Clip"},"widget_override":null}],"output_names":["Out"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Absolute":[3,0]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Artboard","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-10,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-2,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Append Artboards","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[6,-4]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[12317719117993811200,{"persistent_metadata":{"reference":"Merge","display_name":"Dune 4","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":["Out"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16611856724057842399,{"persistent_metadata":{"reference":null,"display_name":"Dune","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":"Color"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":[""],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[640915213983348287,{"persistent_metadata":{"reference":"Rectangle","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"Width"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Individual Corner Radii"},"widget_override":null},{"input_data":{"input_name":"Corner Radius"},"widget_override":null},{"input_data":{"input_name":"Clamped"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-27,-3]}}},"network_metadata":null}}],[5663116427189655422,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"mode":"Increment","min":1.0,"blank_assist":true,"input_name":"Spacing","tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","unit":" px","is_integer":false},"widget_override":"number"},{"input_data":{"blank_assist":true,"mode":"Increment","unit":" px","tooltip":"Exclude some distance from the start of the path before the first instance","is_integer":false,"min":0.0,"input_name":"Start Offset"},"widget_override":"number"},{"input_data":{"mode":"Increment","is_integer":false,"tooltip":"Exclude some distance from the end of the path after the last instance","unit":" px","blank_assist":true,"input_name":"Stop Offset","min":0.0},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize Impure","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2288754089236120499,{"persistent_metadata":{"reference":"Spline","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[22,-3]}}},"network_metadata":null}}],[7828034197076821310,{"persistent_metadata":{"reference":"To u32","display_name":"","input_properties":[{"input_data":{"input_name":"Value"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,1]}}},"network_metadata":null}}],[14158287945315818946,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"y":"Y","unit":" px","x":"X","input_name":"Translation"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"x":"W","y":"H","unit":"x","input_name":"Scale"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"transform_skew"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":["Data"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[15,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10202767637947785546,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"is_integer":false,"min":1.0,"mode":"Increment","tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","blank_assist":true,"input_name":"Spacing","unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":false,"tooltip":"Exclude some distance from the start of the path before the first instance","min":0.0,"input_name":"Start Offset","mode":"Increment","unit":" px","blank_assist":true},"widget_override":"number"},{"input_data":{"min":0.0,"tooltip":"Exclude some distance from the end of the path after the last instance","blank_assist":true,"input_name":"Stop Offset","mode":"Increment","unit":" px","is_integer":false},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize Impure","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11731553664207576737,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-6,-3]}}},"network_metadata":null}}],[14577956936089455769,{"persistent_metadata":{"reference":"Coordinate Value","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"X"},"widget_override":null},{"input_data":{"input_name":"Y"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-1]}}},"network_metadata":null}}],[16943732999059587742,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-3]}}},"network_metadata":null}}],[1791308547102433540,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-20,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,991.0,581.0],"node_graph_top_right":[1980.796875,0.0]},"selection_undo_history":[[]],"selection_redo_history":[]}}}}],[13644002059194136823,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[6097807941755042226,{"persistent_metadata":{"reference":"Merge","display_name":"Dune 1","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":["Out"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Absolute":[-14,40]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4390668436091073484,{"persistent_metadata":{"reference":"Merge","display_name":"Midground in Shadow","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":["Out"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":18}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[12639486733043466090,{"persistent_metadata":{"reference":"Merge","display_name":"Dune in Shadow 3","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":["Out"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2128810469968776913,{"persistent_metadata":{"reference":"Merge","display_name":"Far Mountains","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":["Out"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":16}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[17239043462037837834,{"persistent_metadata":{"reference":null,"display_name":"Dune","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":"Color"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":[""],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2288754089236120499,{"persistent_metadata":{"reference":"Spline","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[22,-3]}}},"network_metadata":null}}],[11731553664207576737,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-6,-3]}}},"network_metadata":null}}],[7828034197076821310,{"persistent_metadata":{"reference":"To u32","display_name":"","input_properties":[{"input_data":{"input_name":"Value"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,1]}}},"network_metadata":null}}],[14158287945315818946,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Translation","y":"Y","x":"X","unit":" px"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"y":"H","input_name":"Scale","unit":"x","x":"W"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"transform_skew"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":["Data"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[15,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14577956936089455769,{"persistent_metadata":{"reference":"Coordinate Value","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"X"},"widget_override":null},{"input_data":{"input_name":"Y"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-1]}}},"network_metadata":null}}],[1791308547102433540,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-20,-3]}}},"network_metadata":null}}],[640915213983348287,{"persistent_metadata":{"reference":"Rectangle","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"Width"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Individual Corner Radii"},"widget_override":null},{"input_data":{"input_name":"Corner Radius"},"widget_override":null},{"input_data":{"input_name":"Clamped"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-27,-3]}}},"network_metadata":null}}],[5663116427189655422,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","unit":" px","mode":"Increment","blank_assist":true,"is_integer":false,"min":1.0,"input_name":"Spacing"},"widget_override":"number"},{"input_data":{"blank_assist":true,"min":0.0,"input_name":"Start Offset","is_integer":false,"mode":"Increment","unit":" px","tooltip":"Exclude some distance from the start of the path before the first instance"},"widget_override":"number"},{"input_data":{"tooltip":"Exclude some distance from the end of the path after the last instance","mode":"Increment","blank_assist":true,"unit":" px","input_name":"Stop Offset","is_integer":false,"min":0.0},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize Impure","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10202767637947785546,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","input_name":"Spacing","mode":"Increment","blank_assist":true,"min":1.0,"is_integer":false,"unit":" px"},"widget_override":"number"},{"input_data":{"tooltip":"Exclude some distance from the start of the path before the first instance","is_integer":false,"unit":" px","input_name":"Start Offset","mode":"Increment","min":0.0,"blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"min":0.0,"tooltip":"Exclude some distance from the end of the path after the last instance","blank_assist":true,"unit":" px","mode":"Increment","input_name":"Stop Offset"},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize Impure","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16943732999059587742,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,991.0,581.0],"node_graph_top_right":[1980.796875,0.0]},"selection_undo_history":[[]],"selection_redo_history":[]}}}}],[12122314434656187176,{"persistent_metadata":{"reference":"Merge","display_name":"Dune in Shadow 1","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":["Out"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Absolute":[-14,27]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[1801066723091712434,{"persistent_metadata":{"reference":null,"display_name":"Dune","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":"Color"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":[""],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[14577956936089455769,{"persistent_metadata":{"reference":"Coordinate Value","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"X"},"widget_override":null},{"input_data":{"input_name":"Y"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-1]}}},"network_metadata":null}}],[16943732999059587742,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-3]}}},"network_metadata":null}}],[1791308547102433540,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-20,-3]}}},"network_metadata":null}}],[640915213983348287,{"persistent_metadata":{"reference":"Rectangle","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"Width"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Individual Corner Radii"},"widget_override":null},{"input_data":{"input_name":"Corner Radius"},"widget_override":null},{"input_data":{"input_name":"Clamped"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-27,-3]}}},"network_metadata":null}}],[2288754089236120499,{"persistent_metadata":{"reference":"Spline","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[22,-3]}}},"network_metadata":null}}],[7828034197076821310,{"persistent_metadata":{"reference":"To u32","display_name":"","input_properties":[{"input_data":{"input_name":"Value"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,1]}}},"network_metadata":null}}],[14158287945315818946,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"x":"X","input_name":"Translation","y":"Y","unit":" px"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"input_name":"Scale","y":"H","unit":"x","x":"W"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"transform_skew"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":["Data"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[15,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11731553664207576737,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-6,-3]}}},"network_metadata":null}}],[10202767637947785546,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"blank_assist":true,"is_integer":false,"mode":"Increment","min":1.0,"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","unit":" px","input_name":"Spacing"},"widget_override":"number"},{"input_data":{"unit":" px","min":0.0,"input_name":"Start Offset","mode":"Increment","blank_assist":true,"is_integer":false,"tooltip":"Exclude some distance from the start of the path before the first instance"},"widget_override":"number"},{"input_data":{"input_name":"Stop Offset","tooltip":"Exclude some distance from the end of the path after the last instance","is_integer":false,"min":0.0,"mode":"Increment","blank_assist":true,"unit":" px"},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize Impure","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[5663116427189655422,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","blank_assist":true,"mode":"Increment","input_name":"Spacing","unit":" px","is_integer":false,"min":1.0},"widget_override":"number"},{"input_data":{"tooltip":"Exclude some distance from the start of the path before the first instance","input_name":"Start Offset","unit":" px","blank_assist":true,"min":0.0,"is_integer":false,"mode":"Increment"},"widget_override":"number"},{"input_data":{"unit":" px","min":0.0,"is_integer":false,"input_name":"Stop Offset","mode":"Increment","blank_assist":true,"tooltip":"Exclude some distance from the end of the path after the last instance"},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize Impure","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,991.0,581.0],"node_graph_top_right":[1980.796875,0.0]},"selection_undo_history":[[]],"selection_redo_history":[]}}}}],[11386926595254122633,{"persistent_metadata":{"reference":"Merge","display_name":"Dune","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":["Out"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[12110920487474373676,{"persistent_metadata":{"reference":"Merge","display_name":"Dune in Shadow 2","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":["Out"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[12416569579970107543,{"persistent_metadata":{"reference":"Spline","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[17437077810654043142,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"blank_assist":true,"input_name":"Spacing","tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","unit":" px","mode":"Increment","is_integer":false,"min":1.0},"widget_override":"number"},{"input_data":{"input_name":"Start Offset","min":0.0,"is_integer":false,"tooltip":"Exclude some distance from the start of the path before the first instance","unit":" px","mode":"Increment","blank_assist":true},"widget_override":"number"},{"input_data":{"input_name":"Stop Offset","is_integer":false,"mode":"Increment","tooltip":"Exclude some distance from the end of the path after the last instance","min":0.0,"unit":" px","blank_assist":true},"widget_override":"number"},{"input_data":{"tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly","input_name":"Adaptive Spacing"},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,5]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[393.8840949272409,-703.048313613491],"tilt":0.0,"zoom":0.7533811475409836,"flip":false},"node_graph_to_viewport":[0.7533811475409836,0.0,0.0,0.7533811475409836,1287.0,51.0],"node_graph_top_right":[1980.796875,0.0]},"selection_undo_history":[[2128810469968776913],[6097807941755042226,15385259560644295534,17327221498641745184,12317719117993811200,9069881382900058607],[17327221498641745184],[6097807941755042226,15385259560644295534,17327221498641745184,12317719117993811200,9069881382900058607],[6097807941755042226,5883606306991910210,2128810469968776913,12416569579970107543,13644002059194136823,17437077810654043142,15002088321732485705],[6097807941755042226,15385259560644295534,17327221498641745184,12317719117993811200,9069881382900058607],[2128810469968776913],[6097807941755042226,15385259560644295534,17327221498641745184,12317719117993811200,9069881382900058607],[15385259560644295534],[6097807941755042226,15385259560644295534,17327221498641745184,12317719117993811200,9069881382900058607],[2128810469968776913,12416569579970107543,13644002059194136823,17437077810654043142,15002088321732485705],[6097807941755042226,15385259560644295534,17327221498641745184,12317719117993811200,9069881382900058607],[13676600738025998635],[2128810469968776913],[11435147660766496741],[15726496377243608372],[4390668436091073484],[11386926595254122633],[11435147660766496741],[15726496377243608372],[15726496377243608372,11435147660766496741,2163528024003768644,12110920487474373676,12639486733043466090,8804763001225416124],[11435147660766496741,2163528024003768644,12110920487474373676,12639486733043466090,8804763001225416124,15726496377243608372],[11435147660766496741],[11435147660766496741,2163528024003768644,12110920487474373676,12639486733043466090,8804763001225416124,15726496377243608372],[11435147660766496741,15726496377243608372,4390668436091073484,11386926595254122633,13676600738025998635,2128810469968776913],[11435147660766496741,2163528024003768644,12110920487474373676,12639486733043466090,8804763001225416124,15726496377243608372],[11435147660766496741],[11435147660766496741,2163528024003768644,12110920487474373676,12639486733043466090,8804763001225416124,15726496377243608372],[4390668436091073484,11386926595254122633,13676600738025998635,2128810469968776913],[11435147660766496741,2163528024003768644,12110920487474373676,12639486733043466090,8804763001225416124,15726496377243608372],[11435147660766496741,2163528024003768644,7128559142392931896,12110920487474373676,13323241418027154136,12639486733043466090,1801066723091712434,8804763001225416124,17154757625902243313,4390668436091073484,12122314434656187176,16611856724057842399,10686861494573327243,10806978668166337270,11386926595254122633,6523786079462141312,13676600738025998635,6097807941755042226,5883606306991910210,15385259560644295534,3726756269632080543,17327221498641745184,3683309254695891012,12317719117993811200,17239043462037837834,9069881382900058607,4037968351431607570,2128810469968776913,12416569579970107543,13644002059194136823,17437077810654043142,15002088321732485705],[11435147660766496741,2163528024003768644,12110920487474373676,12639486733043466090,8804763001225416124,15726496377243608372],[4390668436091073484,11386926595254122633,13676600738025998635,2128810469968776913],[11435147660766496741,2163528024003768644,12110920487474373676,12639486733043466090,8804763001225416124,15726496377243608372],[15726496377243608372],[11435147660766496741,2163528024003768644,12110920487474373676,12639486733043466090,8804763001225416124,15726496377243608372],[4390668436091073484,12122314434656187176,16611856724057842399,10686861494573327243,10806978668166337270,11386926595254122633,6523786079462141312,13676600738025998635,6097807941755042226,5883606306991910210,15385259560644295534,3726756269632080543,17327221498641745184,3683309254695891012,12317719117993811200,17239043462037837834,9069881382900058607,4037968351431607570,2128810469968776913,12416569579970107543,13644002059194136823,17437077810654043142,15002088321732485705],[11435147660766496741,2163528024003768644,12110920487474373676,12639486733043466090,8804763001225416124,15726496377243608372],[13132104524813958174],[11435147660766496741],[2163528024003768644],[12110920487474373676],[12639486733043466090],[8804763001225416124],[11435147660766496741],[15726496377243608372],[3934928477288442109],[239716716021064150],[15726496377243608372],[15726496377243608372,11435147660766496741],[239716716021064150],[239716716021064150,7711570794020903773],[239716716021064150,3934928477288442109],[4390668436091073484],[12122314434656187176],[10686861494573327243],[11386926595254122633],[4390668436091073484],[13676600738025998635,2128810469968776913],[13676600738025998635,6097807941755042226,5883606306991910210,15385259560644295534,3726756269632080543,17327221498641745184,3683309254695891012,12317719117993811200,17239043462037837834,9069881382900058607,4037968351431607570,2128810469968776913,12416569579970107543,13644002059194136823,17437077810654043142,15002088321732485705],[11386926595254122633],[13676600738025998635],[6097807941755042226],[15385259560644295534],[17327221498641745184],[12317719117993811200],[9069881382900058607],[2128810469968776913],[13132104524813958174],[2128810469968776913],[13132104524813958174],[2163528024003768644],[239716716021064150],[3934928477288442109],[8804763001225416124],[12639486733043466090],[12110920487474373676],[2163528024003768644],[4390668436091073484],[13676600738025998635],[2128810469968776913],[2163528024003768644],[9069881382900058607],[12317719117993811200,9069881382900058607],[17327221498641745184,12317719117993811200,9069881382900058607],[15385259560644295534,17327221498641745184,12317719117993811200,9069881382900058607],[12317719117993811200,15385259560644295534,9069881382900058607,17327221498641745184,6097807941755042226],[17327221498641745184,12317719117993811200,11386926595254122633,6097807941755042226,9069881382900058607,15385259560644295534],[9069881382900058607,6097807941755042226,10686861494573327243,15385259560644295534,11386926595254122633,12317719117993811200,17327221498641745184],[10686861494573327243,15385259560644295534,12122314434656187176,11386926595254122633,9069881382900058607,6097807941755042226,12317719117993811200,17327221498641745184],[12122314434656187176,6097807941755042226,11386926595254122633,12317719117993811200,17327221498641745184,10686861494573327243,239716716021064150,15385259560644295534,9069881382900058607],[9069881382900058607,239716716021064150,6097807941755042226,12122314434656187176,12317719117993811200,10686861494573327243,15385259560644295534,17327221498641745184,11386926595254122633,3934928477288442109],[9069881382900058607,13676600738025998635,3934928477288442109,12122314434656187176,6097807941755042226,15385259560644295534,4390668436091073484,10686861494573327243,17327221498641745184,11386926595254122633,12317719117993811200,239716716021064150],[6097807941755042226,3934928477288442109,4390668436091073484,9069881382900058607,13676600738025998635,11386926595254122633,15385259560644295534,12122314434656187176,8804763001225416124,10686861494573327243,239716716021064150,12317719117993811200,17327221498641745184],[9069881382900058607,12122314434656187176,13676600738025998635,10686861494573327243,12317719117993811200,6097807941755042226,15385259560644295534,239716716021064150,17327221498641745184,11386926595254122633,3934928477288442109,8804763001225416124,12639486733043466090,4390668436091073484],[10686861494573327243,15385259560644295534,17327221498641745184,239716716021064150,8804763001225416124,6097807941755042226,11386926595254122633,12317719117993811200,12122314434656187176,9069881382900058607,3934928477288442109,12639486733043466090],[10686861494573327243,17327221498641745184,12317719117993811200,11386926595254122633,12639486733043466090,12122314434656187176,9069881382900058607,6097807941755042226,12110920487474373676,3934928477288442109,15385259560644295534,8804763001225416124,239716716021064150],[12110920487474373676,10686861494573327243,11386926595254122633,12317719117993811200,8804763001225416124,3934928477288442109,9069881382900058607,15385259560644295534,2163528024003768644,17327221498641745184,239716716021064150,12639486733043466090,12122314434656187176,6097807941755042226],[2128810469968776913],[]],"selection_redo_history":[]}}},"collapsed":[4390668436091073485,13676600738025998636,13132104524813958175],"name":"Parametric Dunescape","commit_hash":"c4e16e1aac642bbcde72f41f86deed79e6e38006","document_ptz":{"pan":[-999.515765085624,-500.18277881031514],"tilt":0.0,"zoom":0.940975,"flip":false},"document_mode":"DesignMode","view_mode":"Normal","overlays_visibility_settings":{"all":true,"artboard_name":true,"compass_rose":true,"quick_measurement":true,"transform_measurement":true,"transform_cage":true,"hover_outline":true,"selection_outline":true,"pivot":true,"path":true,"anchors":true,"handles":true},"rulers_visible":true,"snapping_state":{"snapping_enabled":true,"grid_snapping":false,"artboards":true,"tolerance":8.0,"bounding_box":{"center_point":true,"corner_point":true,"edge_midpoint":true,"align_with_edges":true,"distribute_evenly":true},"path":{"anchor_point":true,"line_midpoint":true,"along_path":true,"normal_to_path":true,"tangent_to_path":true,"path_intersection_point":true,"align_with_anchor_point":true,"perpendicular_from_endpoint":true},"grid":{"origin":[0.0,0.0],"grid_type":{"Rectangular":{"spacing":[1.0,1.0]}},"grid_color":{"red":0.6038274,"green":0.6038274,"blue":0.6038274,"alpha":1.0},"dot_display":false}},"graph_view_overlay_open":false,"graph_fade_artwork_percentage":80.0} \ No newline at end of file +{"network_interface":{"network":{"exports":[{"Node":{"node_id":4445985685181725042,"output_index":0,"lambda":false}}],"nodes":[[17154757625902243313,{"inputs":[{"Value":{"tagged_value":"None","exposed":true}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.23529412,"green":0.23529412,"blue":0.24313726,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"F64":1670.79570439},"exposed":false}},{"Value":{"tagged_value":{"F64":24.0},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2288754089236120499,"output_index":0,"lambda":false}}],"nodes":[[2288754089236120499,{"inputs":[{"Node":{"node_id":14158287945315818946,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SplineNode"}},"visible":true,"skip_deduplication":false}],[14158287945315818946,{"inputs":[{"Node":{"node_id":16943732999059587742,"output_index":0,"lambda":false}},{"Node":{"node_id":14577956936089455769,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.6181095265062186,3.496297826945966]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.4855225354961647,0.31002285853371414]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11731553664207576737,{"inputs":[{"Node":{"node_id":757876048866560520,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":48.900000000000006},"exposed":false}},{"Node":{"node_id":7828034197076821310,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[7828034197076821310,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":3}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::ToU32Node"}},"visible":true,"skip_deduplication":false}],[640915213983348287,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":4000.0},"exposed":false}},{"Value":{"tagged_value":{"F64":500.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::generator_nodes::RectangleNode"}},"visible":true,"skip_deduplication":false}],[1791308547102433540,{"inputs":[{"Node":{"node_id":640915213983348287,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":1}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.99607843,"green":0.827451,"blue":0.65882355,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14577956936089455769,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":1050.10498991},"exposed":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":2}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::CoordinateValueNode"}},"visible":true,"skip_deduplication":false}],[16943732999059587742,{"inputs":[{"Node":{"node_id":1357621220363171879,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.399999999999956},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[1357621220363171879,{"inputs":[{"Node":{"node_id":11731553664207576737,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":172.9},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[757876048866560520,{"inputs":[{"Node":{"node_id":1791308547102433540,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":800.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3683309254695891012,{"inputs":[{"Value":{"tagged_value":"None","exposed":true}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.68235296,"green":0.5372549,"blue":0.4627451,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"F64":1485.34393334},"exposed":false}},{"Value":{"tagged_value":{"F64":225.0},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2288754089236120499,"output_index":0,"lambda":false}}],"nodes":[[3916070947050514908,{"inputs":[{"Node":{"node_id":1791308547102433540,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":800.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2288754089236120499,{"inputs":[{"Node":{"node_id":14158287945315818946,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SplineNode"}},"visible":true,"skip_deduplication":false}],[14158287945315818946,{"inputs":[{"Node":{"node_id":16943732999059587742,"output_index":0,"lambda":false}},{"Node":{"node_id":14577956936089455769,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.6181095265062186,3.496297826945966]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.4855225354961647,0.31002285853371414]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11731553664207576737,{"inputs":[{"Node":{"node_id":3916070947050514908,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":48.900000000000006},"exposed":false}},{"Node":{"node_id":7828034197076821310,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[7828034197076821310,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":3}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::ToU32Node"}},"visible":true,"skip_deduplication":false}],[640915213983348287,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":4000.0},"exposed":false}},{"Value":{"tagged_value":{"F64":500.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::generator_nodes::RectangleNode"}},"visible":true,"skip_deduplication":false}],[1791308547102433540,{"inputs":[{"Node":{"node_id":640915213983348287,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":1}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.99607843,"green":0.827451,"blue":0.65882355,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14577956936089455769,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":1050.10498991},"exposed":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":2}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::CoordinateValueNode"}},"visible":true,"skip_deduplication":false}],[16943732999059587742,{"inputs":[{"Node":{"node_id":10720574559271598132,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.399999999999956},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[10720574559271598132,{"inputs":[{"Node":{"node_id":11731553664207576737,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":172.9},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13644002059194136823,{"inputs":[{"Node":{"node_id":17437077810654043142,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":5.599999999999968},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[4037968351431607570,{"inputs":[{"Value":{"tagged_value":"None","exposed":true}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8666667,"green":0.69803923,"blue":0.56078434,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"F64":1442.36628417},"exposed":false}},{"Value":{"tagged_value":{"F64":318.0},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2288754089236120499,"output_index":0,"lambda":false}}],"nodes":[[11874141024063691837,{"inputs":[{"Node":{"node_id":1791308547102433540,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":800.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2288754089236120499,{"inputs":[{"Node":{"node_id":14158287945315818946,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SplineNode"}},"visible":true,"skip_deduplication":false}],[14158287945315818946,{"inputs":[{"Node":{"node_id":16943732999059587742,"output_index":0,"lambda":false}},{"Node":{"node_id":14577956936089455769,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.6181095265062186,3.496297826945966]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.4855225354961647,0.31002285853371414]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11731553664207576737,{"inputs":[{"Node":{"node_id":11874141024063691837,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":48.900000000000006},"exposed":false}},{"Node":{"node_id":7828034197076821310,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[7828034197076821310,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":3}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::ToU32Node"}},"visible":true,"skip_deduplication":false}],[640915213983348287,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":4000.0},"exposed":false}},{"Value":{"tagged_value":{"F64":500.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::generator_nodes::RectangleNode"}},"visible":true,"skip_deduplication":false}],[1791308547102433540,{"inputs":[{"Node":{"node_id":640915213983348287,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":1}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.99607843,"green":0.827451,"blue":0.65882355,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14577956936089455769,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":1050.10498991},"exposed":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":2}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::CoordinateValueNode"}},"visible":true,"skip_deduplication":false}],[16943732999059587742,{"inputs":[{"Node":{"node_id":7807438675023750219,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.399999999999956},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[7807438675023750219,{"inputs":[{"Node":{"node_id":11731553664207576737,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":172.9},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13323241418027154136,{"inputs":[{"Value":{"tagged_value":"None","exposed":true}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.18039216,"green":0.19215687,"blue":0.21960784,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"F64":1733.30579952},"exposed":false}},{"Value":{"tagged_value":{"F64":77.0},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2288754089236120499,"output_index":0,"lambda":false}}],"nodes":[[2288754089236120499,{"inputs":[{"Node":{"node_id":14158287945315818946,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SplineNode"}},"visible":true,"skip_deduplication":false}],[14158287945315818946,{"inputs":[{"Node":{"node_id":16943732999059587742,"output_index":0,"lambda":false}},{"Node":{"node_id":14577956936089455769,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.6181095265062186,3.496297826945966]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.4855225354961647,0.31002285853371414]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11731553664207576737,{"inputs":[{"Node":{"node_id":16504069171520924548,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":48.900000000000006},"exposed":false}},{"Node":{"node_id":7828034197076821310,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[7828034197076821310,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":3}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::ToU32Node"}},"visible":true,"skip_deduplication":false}],[3434804841107735149,{"inputs":[{"Node":{"node_id":11731553664207576737,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":172.9},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[640915213983348287,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":4000.0},"exposed":false}},{"Value":{"tagged_value":{"F64":500.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::generator_nodes::RectangleNode"}},"visible":true,"skip_deduplication":false}],[1791308547102433540,{"inputs":[{"Node":{"node_id":640915213983348287,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":1}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.99607843,"green":0.827451,"blue":0.65882355,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14577956936089455769,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":1050.10498991},"exposed":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":2}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::CoordinateValueNode"}},"visible":true,"skip_deduplication":false}],[16943732999059587742,{"inputs":[{"Node":{"node_id":3434804841107735149,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.399999999999956},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[16504069171520924548,{"inputs":[{"Node":{"node_id":1791308547102433540,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":800.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[12110920487474373676,{"inputs":[{"Node":{"node_id":12639486733043466090,"output_index":0,"lambda":false}},{"Node":{"node_id":13323241418027154136,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4390668436091073484,{"inputs":[{"Node":{"node_id":13676600738025998635,"output_index":0,"lambda":false}},{"Node":{"node_id":12122314434656187176,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10806978668166337270,{"inputs":[{"Value":{"tagged_value":"None","exposed":true}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.21176471,"green":0.21568628,"blue":0.23137255,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"F64":1579.30304164},"exposed":false}},{"Value":{"tagged_value":{"F64":142.0},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2288754089236120499,"output_index":0,"lambda":false}}],"nodes":[[9133354469966676056,{"inputs":[{"Node":{"node_id":11731553664207576737,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":172.9},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2288754089236120499,{"inputs":[{"Node":{"node_id":14158287945315818946,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SplineNode"}},"visible":true,"skip_deduplication":false}],[14158287945315818946,{"inputs":[{"Node":{"node_id":16943732999059587742,"output_index":0,"lambda":false}},{"Node":{"node_id":14577956936089455769,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.6181095265062186,3.496297826945966]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.4855225354961647,0.31002285853371414]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11731553664207576737,{"inputs":[{"Node":{"node_id":3765311973789472189,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":48.900000000000006},"exposed":false}},{"Node":{"node_id":7828034197076821310,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[7828034197076821310,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":3}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::ToU32Node"}},"visible":true,"skip_deduplication":false}],[640915213983348287,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":4000.0},"exposed":false}},{"Value":{"tagged_value":{"F64":500.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::generator_nodes::RectangleNode"}},"visible":true,"skip_deduplication":false}],[1791308547102433540,{"inputs":[{"Node":{"node_id":640915213983348287,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":1}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.99607843,"green":0.827451,"blue":0.65882355,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14577956936089455769,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":1050.10498991},"exposed":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":2}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::CoordinateValueNode"}},"visible":true,"skip_deduplication":false}],[16943732999059587742,{"inputs":[{"Node":{"node_id":9133354469966676056,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.399999999999956},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[3765311973789472189,{"inputs":[{"Node":{"node_id":1791308547102433540,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":800.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[5883606306991910210,{"inputs":[{"Value":{"tagged_value":"None","exposed":true}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.4862745,"green":0.43137255,"blue":0.39607844,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"F64":1524.31304726},"exposed":false}},{"Value":{"tagged_value":{"F64":175.0},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2288754089236120499,"output_index":0,"lambda":false}}],"nodes":[[16598825029377599083,{"inputs":[{"Node":{"node_id":1791308547102433540,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":800.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2288754089236120499,{"inputs":[{"Node":{"node_id":14158287945315818946,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SplineNode"}},"visible":true,"skip_deduplication":false}],[14158287945315818946,{"inputs":[{"Node":{"node_id":16943732999059587742,"output_index":0,"lambda":false}},{"Node":{"node_id":14577956936089455769,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.6181095265062186,3.496297826945966]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.4855225354961647,0.31002285853371414]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11731553664207576737,{"inputs":[{"Node":{"node_id":16598825029377599083,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":48.900000000000006},"exposed":false}},{"Node":{"node_id":7828034197076821310,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[7828034197076821310,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":3}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::ToU32Node"}},"visible":true,"skip_deduplication":false}],[6686718746443793247,{"inputs":[{"Node":{"node_id":11731553664207576737,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":172.9},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[640915213983348287,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":4000.0},"exposed":false}},{"Value":{"tagged_value":{"F64":500.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::generator_nodes::RectangleNode"}},"visible":true,"skip_deduplication":false}],[1791308547102433540,{"inputs":[{"Node":{"node_id":640915213983348287,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":1}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.99607843,"green":0.827451,"blue":0.65882355,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14577956936089455769,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":1050.10498991},"exposed":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":2}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::CoordinateValueNode"}},"visible":true,"skip_deduplication":false}],[16943732999059587742,{"inputs":[{"Node":{"node_id":6686718746443793247,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.399999999999956},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13132104524813958174,{"inputs":[{"Node":{"node_id":4390668436091073484,"output_index":0,"lambda":false}},{"Node":{"node_id":2163528024003768644,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[12416569579970107543,{"inputs":[{"Node":{"node_id":13644002059194136823,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SplineNode"}},"visible":true,"skip_deduplication":false}],[9069881382900058607,{"inputs":[{"Value":{"tagged_value":{"GraphicGroup":{"instance":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":4037968351431607570,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[12639486733043466090,{"inputs":[{"Node":{"node_id":8804763001225416124,"output_index":0,"lambda":false}},{"Node":{"node_id":1801066723091712434,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7128559142392931896,{"inputs":[{"Value":{"tagged_value":"None","exposed":true}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.15686275,"green":0.16862746,"blue":0.1882353,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"F64":1803.43646796},"exposed":false}},{"Value":{"tagged_value":{"F64":35.0},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2288754089236120499,"output_index":0,"lambda":false}}],"nodes":[[2288754089236120499,{"inputs":[{"Node":{"node_id":14158287945315818946,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SplineNode"}},"visible":true,"skip_deduplication":false}],[14158287945315818946,{"inputs":[{"Node":{"node_id":16943732999059587742,"output_index":0,"lambda":false}},{"Node":{"node_id":14577956936089455769,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.6181095265062186,3.496297826945966]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.4855225354961647,0.31002285853371414]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11731553664207576737,{"inputs":[{"Node":{"node_id":10094915787292727725,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":48.900000000000006},"exposed":false}},{"Node":{"node_id":7828034197076821310,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[7828034197076821310,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":3}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::ToU32Node"}},"visible":true,"skip_deduplication":false}],[10094915787292727725,{"inputs":[{"Node":{"node_id":1791308547102433540,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":800.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[640915213983348287,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":4000.0},"exposed":false}},{"Value":{"tagged_value":{"F64":500.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::generator_nodes::RectangleNode"}},"visible":true,"skip_deduplication":false}],[1791308547102433540,{"inputs":[{"Node":{"node_id":640915213983348287,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":1}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.99607843,"green":0.827451,"blue":0.65882355,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14577956936089455769,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":1050.10498991},"exposed":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":2}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::CoordinateValueNode"}},"visible":true,"skip_deduplication":false}],[16943732999059587742,{"inputs":[{"Node":{"node_id":18443039976647938912,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.399999999999956},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[18443039976647938912,{"inputs":[{"Node":{"node_id":11731553664207576737,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":172.9},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[17327221498641745184,{"inputs":[{"Node":{"node_id":12317719117993811200,"output_index":0,"lambda":false}},{"Node":{"node_id":3683309254695891012,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7711570794020903773,{"inputs":[{"Value":{"tagged_value":"None","exposed":true}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8784314,"green":0.49019608,"blue":0.36862746,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"F64":1513.3360814},"exposed":false}},{"Value":{"tagged_value":{"F64":22.0},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2288754089236120499,"output_index":0,"lambda":false}}],"nodes":[[3025883099767376126,{"inputs":[{"Node":{"node_id":1791308547102433540,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":800.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2288754089236120499,{"inputs":[{"Node":{"node_id":14158287945315818946,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SplineNode"}},"visible":true,"skip_deduplication":false}],[14158287945315818946,{"inputs":[{"Node":{"node_id":16943732999059587742,"output_index":0,"lambda":false}},{"Node":{"node_id":14577956936089455769,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.6181095265062186,3.496297826945966]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.4855225354961647,0.31002285853371414]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11731553664207576737,{"inputs":[{"Node":{"node_id":3025883099767376126,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":48.900000000000006},"exposed":false}},{"Node":{"node_id":7828034197076821310,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[7828034197076821310,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":3}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::ToU32Node"}},"visible":true,"skip_deduplication":false}],[1126802566044359983,{"inputs":[{"Node":{"node_id":11731553664207576737,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":172.9},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[640915213983348287,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":4000.0},"exposed":false}},{"Value":{"tagged_value":{"F64":500.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::generator_nodes::RectangleNode"}},"visible":true,"skip_deduplication":false}],[1791308547102433540,{"inputs":[{"Node":{"node_id":640915213983348287,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":1}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.99607843,"green":0.827451,"blue":0.65882355,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14577956936089455769,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":1050.10498991},"exposed":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":2}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::CoordinateValueNode"}},"visible":true,"skip_deduplication":false}],[16943732999059587742,{"inputs":[{"Node":{"node_id":1126802566044359983,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.399999999999956},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10686861494573327243,{"inputs":[{"Node":{"node_id":11386926595254122633,"output_index":0,"lambda":false}},{"Node":{"node_id":10806978668166337270,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[17589660903986237301,{"inputs":[{"Value":{"tagged_value":"None","exposed":true}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.9529412,"green":0.6431373,"blue":0.42352942,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"F64":1614.38741737},"exposed":false}},{"Value":{"tagged_value":{"F64":17.0},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2288754089236120499,"output_index":0,"lambda":false}}],"nodes":[[3289411516263327806,{"inputs":[{"Node":{"node_id":1791308547102433540,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":800.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2288754089236120499,{"inputs":[{"Node":{"node_id":14158287945315818946,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SplineNode"}},"visible":true,"skip_deduplication":false}],[14158287945315818946,{"inputs":[{"Node":{"node_id":16943732999059587742,"output_index":0,"lambda":false}},{"Node":{"node_id":14577956936089455769,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.6181095265062186,3.496297826945966]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.4855225354961647,0.31002285853371414]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11731553664207576737,{"inputs":[{"Node":{"node_id":3289411516263327806,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":48.900000000000006},"exposed":false}},{"Node":{"node_id":7828034197076821310,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[7828034197076821310,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":3}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::ToU32Node"}},"visible":true,"skip_deduplication":false}],[640915213983348287,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":4000.0},"exposed":false}},{"Value":{"tagged_value":{"F64":500.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::generator_nodes::RectangleNode"}},"visible":true,"skip_deduplication":false}],[1791308547102433540,{"inputs":[{"Node":{"node_id":640915213983348287,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":1}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.99607843,"green":0.827451,"blue":0.65882355,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14577956936089455769,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":1050.10498991},"exposed":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":2}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::CoordinateValueNode"}},"visible":true,"skip_deduplication":false}],[16943732999059587742,{"inputs":[{"Node":{"node_id":12029121808718862100,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.399999999999956},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[12029121808718862100,{"inputs":[{"Node":{"node_id":11731553664207576737,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":172.9},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2163528024003768644,{"inputs":[{"Node":{"node_id":12110920487474373676,"output_index":0,"lambda":false}},{"Node":{"node_id":7128559142392931896,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[6523786079462141312,{"inputs":[{"Value":{"tagged_value":"None","exposed":true}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.85882354,"green":0.57254905,"blue":0.43529412,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"F64":1491.01593158},"exposed":false}},{"Value":{"tagged_value":{"F64":173.0},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2288754089236120499,"output_index":0,"lambda":false}}],"nodes":[[7783268010546120518,{"inputs":[{"Node":{"node_id":11731553664207576737,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":172.9},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2288754089236120499,{"inputs":[{"Node":{"node_id":14158287945315818946,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SplineNode"}},"visible":true,"skip_deduplication":false}],[14158287945315818946,{"inputs":[{"Node":{"node_id":16943732999059587742,"output_index":0,"lambda":false}},{"Node":{"node_id":14577956936089455769,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.6181095265062186,3.496297826945966]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.4855225354961647,0.31002285853371414]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11731553664207576737,{"inputs":[{"Node":{"node_id":16009834030113172488,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":48.900000000000006},"exposed":false}},{"Node":{"node_id":7828034197076821310,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[7828034197076821310,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":3}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::ToU32Node"}},"visible":true,"skip_deduplication":false}],[640915213983348287,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":4000.0},"exposed":false}},{"Value":{"tagged_value":{"F64":500.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::generator_nodes::RectangleNode"}},"visible":true,"skip_deduplication":false}],[1791308547102433540,{"inputs":[{"Node":{"node_id":640915213983348287,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":1}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.99607843,"green":0.827451,"blue":0.65882355,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14577956936089455769,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":1050.10498991},"exposed":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":2}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::CoordinateValueNode"}},"visible":true,"skip_deduplication":false}],[16943732999059587742,{"inputs":[{"Node":{"node_id":7783268010546120518,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.399999999999956},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[16009834030113172488,{"inputs":[{"Node":{"node_id":1791308547102433540,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":800.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11386926595254122633,{"inputs":[{"Value":{"tagged_value":{"GraphicGroup":{"instance":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":6523786079462141312,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15002088321732485705,{"inputs":[{"Value":{"tagged_value":"None","exposed":true}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.99607843,"green":0.827451,"blue":0.65882355,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"F64":1343.63187023},"exposed":false}},{"Value":{"tagged_value":{"F64":349.0},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2288754089236120499,"output_index":0,"lambda":false}}],"nodes":[[2288754089236120499,{"inputs":[{"Node":{"node_id":14158287945315818946,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SplineNode"}},"visible":true,"skip_deduplication":false}],[14158287945315818946,{"inputs":[{"Node":{"node_id":16943732999059587742,"output_index":0,"lambda":false}},{"Node":{"node_id":14577956936089455769,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.6181095265062186,3.496297826945966]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.4855225354961647,0.31002285853371414]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11731553664207576737,{"inputs":[{"Node":{"node_id":15212962088799153943,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":48.900000000000006},"exposed":false}},{"Node":{"node_id":7828034197076821310,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[7828034197076821310,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":3}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::ToU32Node"}},"visible":true,"skip_deduplication":false}],[640915213983348287,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":4000.0},"exposed":false}},{"Value":{"tagged_value":{"F64":500.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::generator_nodes::RectangleNode"}},"visible":true,"skip_deduplication":false}],[1791308547102433540,{"inputs":[{"Node":{"node_id":640915213983348287,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":1}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.99607843,"green":0.827451,"blue":0.65882355,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14577956936089455769,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":1050.10498991},"exposed":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":2}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::CoordinateValueNode"}},"visible":true,"skip_deduplication":false}],[16943732999059587742,{"inputs":[{"Node":{"node_id":8591396027454826376,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.399999999999956},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[8591396027454826376,{"inputs":[{"Node":{"node_id":11731553664207576737,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":172.9},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15212962088799153943,{"inputs":[{"Node":{"node_id":1791308547102433540,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":800.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3934928477288442109,{"inputs":[{"Node":{"node_id":239716716021064150,"output_index":0,"lambda":false}},{"Node":{"node_id":17589660903986237301,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16611856724057842399,{"inputs":[{"Value":{"tagged_value":"None","exposed":true}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.23529412,"green":0.23529412,"blue":0.24313726,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"F64":1554.40785539},"exposed":false}},{"Value":{"tagged_value":{"F64":50.0},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2288754089236120499,"output_index":0,"lambda":false}}],"nodes":[[17232801702996970986,{"inputs":[{"Node":{"node_id":1791308547102433540,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":800.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[9065988052616974602,{"inputs":[{"Node":{"node_id":11731553664207576737,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":172.9},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2288754089236120499,{"inputs":[{"Node":{"node_id":14158287945315818946,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SplineNode"}},"visible":true,"skip_deduplication":false}],[14158287945315818946,{"inputs":[{"Node":{"node_id":16943732999059587742,"output_index":0,"lambda":false}},{"Node":{"node_id":14577956936089455769,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.6181095265062186,3.496297826945966]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.4855225354961647,0.31002285853371414]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11731553664207576737,{"inputs":[{"Node":{"node_id":17232801702996970986,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":48.900000000000006},"exposed":false}},{"Node":{"node_id":7828034197076821310,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[7828034197076821310,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":3}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::ToU32Node"}},"visible":true,"skip_deduplication":false}],[640915213983348287,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":4000.0},"exposed":false}},{"Value":{"tagged_value":{"F64":500.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::generator_nodes::RectangleNode"}},"visible":true,"skip_deduplication":false}],[1791308547102433540,{"inputs":[{"Node":{"node_id":640915213983348287,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":1}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.99607843,"green":0.827451,"blue":0.65882355,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14577956936089455769,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":1050.10498991},"exposed":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":2}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::CoordinateValueNode"}},"visible":true,"skip_deduplication":false}],[16943732999059587742,{"inputs":[{"Node":{"node_id":9065988052616974602,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.399999999999956},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3726756269632080543,{"inputs":[{"Value":{"tagged_value":"None","exposed":true}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.5254902,"green":0.45882353,"blue":0.41568628,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"F64":1465.6573046},"exposed":false}},{"Value":{"tagged_value":{"F64":230.0},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2288754089236120499,"output_index":0,"lambda":false}}],"nodes":[[5294703684886212416,{"inputs":[{"Node":{"node_id":1791308547102433540,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":800.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7419291594083587754,{"inputs":[{"Node":{"node_id":11731553664207576737,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":172.9},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2288754089236120499,{"inputs":[{"Node":{"node_id":14158287945315818946,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SplineNode"}},"visible":true,"skip_deduplication":false}],[14158287945315818946,{"inputs":[{"Node":{"node_id":16943732999059587742,"output_index":0,"lambda":false}},{"Node":{"node_id":14577956936089455769,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.6181095265062186,3.496297826945966]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.4855225354961647,0.31002285853371414]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11731553664207576737,{"inputs":[{"Node":{"node_id":5294703684886212416,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":48.900000000000006},"exposed":false}},{"Node":{"node_id":7828034197076821310,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[7828034197076821310,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":3}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::ToU32Node"}},"visible":true,"skip_deduplication":false}],[640915213983348287,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":4000.0},"exposed":false}},{"Value":{"tagged_value":{"F64":500.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::generator_nodes::RectangleNode"}},"visible":true,"skip_deduplication":false}],[1791308547102433540,{"inputs":[{"Node":{"node_id":640915213983348287,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":1}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.99607843,"green":0.827451,"blue":0.65882355,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14577956936089455769,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":1050.10498991},"exposed":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":2}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::CoordinateValueNode"}},"visible":true,"skip_deduplication":false}],[16943732999059587742,{"inputs":[{"Node":{"node_id":7419291594083587754,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.399999999999956},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[1801066723091712434,{"inputs":[{"Value":{"tagged_value":"None","exposed":true}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.21176471,"green":0.21568628,"blue":0.23137255,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"F64":1744.31393592},"exposed":false}},{"Value":{"tagged_value":{"F64":63.0},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2288754089236120499,"output_index":0,"lambda":false}}],"nodes":[[2288754089236120499,{"inputs":[{"Node":{"node_id":14158287945315818946,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SplineNode"}},"visible":true,"skip_deduplication":false}],[14158287945315818946,{"inputs":[{"Node":{"node_id":16943732999059587742,"output_index":0,"lambda":false}},{"Node":{"node_id":14577956936089455769,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.6181095265062186,3.496297826945966]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.4855225354961647,0.31002285853371414]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11731553664207576737,{"inputs":[{"Node":{"node_id":14514477720912258595,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":48.900000000000006},"exposed":false}},{"Node":{"node_id":7828034197076821310,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[7828034197076821310,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":3}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::ToU32Node"}},"visible":true,"skip_deduplication":false}],[640915213983348287,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":4000.0},"exposed":false}},{"Value":{"tagged_value":{"F64":500.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::generator_nodes::RectangleNode"}},"visible":true,"skip_deduplication":false}],[1791308547102433540,{"inputs":[{"Node":{"node_id":640915213983348287,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":1}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.99607843,"green":0.827451,"blue":0.65882355,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14577956936089455769,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":1050.10498991},"exposed":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":2}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::CoordinateValueNode"}},"visible":true,"skip_deduplication":false}],[16943732999059587742,{"inputs":[{"Node":{"node_id":18341697272814101120,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.399999999999956},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[18341697272814101120,{"inputs":[{"Node":{"node_id":11731553664207576737,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":172.9},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14514477720912258595,{"inputs":[{"Node":{"node_id":1791308547102433540,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":800.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[12317719117993811200,{"inputs":[{"Node":{"node_id":9069881382900058607,"output_index":0,"lambda":false}},{"Node":{"node_id":17239043462037837834,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[8804763001225416124,{"inputs":[{"Node":{"node_id":3934928477288442109,"output_index":0,"lambda":false}},{"Node":{"node_id":17154757625902243313,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[17239043462037837834,{"inputs":[{"Value":{"tagged_value":"None","exposed":true}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8039216,"green":0.6627451,"blue":0.52156866,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"F64":1447.11050605},"exposed":false}},{"Value":{"tagged_value":{"F64":309.0},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2288754089236120499,"output_index":0,"lambda":false}}],"nodes":[[2288754089236120499,{"inputs":[{"Node":{"node_id":14158287945315818946,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SplineNode"}},"visible":true,"skip_deduplication":false}],[14158287945315818946,{"inputs":[{"Node":{"node_id":16943732999059587742,"output_index":0,"lambda":false}},{"Node":{"node_id":14577956936089455769,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.6181095265062186,3.496297826945966]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.4855225354961647,0.31002285853371414]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11731553664207576737,{"inputs":[{"Node":{"node_id":7260397085903590160,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":48.900000000000006},"exposed":false}},{"Node":{"node_id":7828034197076821310,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[7828034197076821310,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":3}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::ToU32Node"}},"visible":true,"skip_deduplication":false}],[15937218612227302315,{"inputs":[{"Node":{"node_id":11731553664207576737,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":172.9},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[640915213983348287,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":4000.0},"exposed":false}},{"Value":{"tagged_value":{"F64":500.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::generator_nodes::RectangleNode"}},"visible":true,"skip_deduplication":false}],[1791308547102433540,{"inputs":[{"Node":{"node_id":640915213983348287,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":1}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.99607843,"green":0.827451,"blue":0.65882355,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14577956936089455769,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":1050.10498991},"exposed":false}},{"Network":{"import_type":{"Generic":"T"},"import_index":2}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::ops::CoordinateValueNode"}},"visible":true,"skip_deduplication":false}],[16943732999059587742,{"inputs":[{"Node":{"node_id":15937218612227302315,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.399999999999956},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::JitterPointsNode"}},"visible":true,"skip_deduplication":false}],[7260397085903590160,{"inputs":[{"Node":{"node_id":1791308547102433540,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":800.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2128810469968776913,{"inputs":[{"Value":{"tagged_value":{"GraphicGroup":{"instance":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":12416569579970107543,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[239716716021064150,{"inputs":[{"Value":{"tagged_value":{"GraphicGroup":{"instance":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":7711570794020903773,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15385259560644295534,{"inputs":[{"Node":{"node_id":17327221498641745184,"output_index":0,"lambda":false}},{"Node":{"node_id":3726756269632080543,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4445985685181725042,{"inputs":[{"Value":{"tagged_value":{"ArtboardGroup":{"instance":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":13132104524813958174,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"IVec2":[0,0]},"exposed":false}},{"Value":{"tagged_value":{"IVec2":[2000,1000]},"exposed":false}},{"Value":{"tagged_value":{"Color":{"red":0.99607843,"green":0.8745098,"blue":0.7019608,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graph_craft::document::value::TaggedValue","alias":null}},"import_index":1}},{"Value":{"tagged_value":{"String":"Artboard"},"exposed":false}},{"Network":{"import_type":{"Concrete":{"name":"graph_craft::document::value::TaggedValue","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"graph_craft::document::value::TaggedValue","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"graph_craft::document::value::TaggedValue","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"graph_craft::document::value::TaggedValue","alias":null}},"import_index":5}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToArtboardNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Network":{"import_type":{"Fn":[{"Concrete":{"name":"core::option::Option>","alias":null}},{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}}]},"import_index":0}},{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::AppendArtboardNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[12122314434656187176,{"inputs":[{"Node":{"node_id":10686861494573327243,"output_index":0,"lambda":false}},{"Node":{"node_id":16611856724057842399,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13676600738025998635,{"inputs":[{"Node":{"node_id":2128810469968776913,"output_index":0,"lambda":false}},{"Node":{"node_id":6097807941755042226,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[6097807941755042226,{"inputs":[{"Node":{"node_id":15385259560644295534,"output_index":0,"lambda":false}},{"Node":{"node_id":5883606306991910210,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[17437077810654043142,{"inputs":[{"Node":{"node_id":15002088321732485705,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":40.0},"exposed":false}},{"Value":{"tagged_value":{"F64":40.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]},"network_metadata":{"persistent_metadata":{"node_metadata":[[17327221498641745184,{"persistent_metadata":{"reference":"Merge","display_name":"Dune 3","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":["Out"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[95.5,23.5],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,1086.0,604.0],"node_graph_top_right":[1980.796875,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[5883606306991910210,{"persistent_metadata":{"reference":null,"display_name":"Dune","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":"Color"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":[""],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2288754089236120499,{"persistent_metadata":{"reference":"Spline","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[22,-3]}}},"network_metadata":null}}],[7828034197076821310,{"persistent_metadata":{"reference":"To u32","display_name":"","input_properties":[{"input_data":{"input_name":"Value"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,1]}}},"network_metadata":null}}],[16943732999059587742,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-3]}}},"network_metadata":null}}],[14158287945315818946,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"unit":" px","x":"X","y":"Y","input_name":"Translation"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"unit":"x","input_name":"Scale","y":"H","x":"W"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"transform_skew"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":["Data"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[15,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11731553664207576737,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-6,-3]}}},"network_metadata":null}}],[14577956936089455769,{"persistent_metadata":{"reference":"Coordinate Value","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"X"},"widget_override":null},{"input_data":{"input_name":"Y"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-1]}}},"network_metadata":null}}],[6686718746443793247,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"unit":" px","blank_assist":true,"min":0.0,"is_integer":false,"mode":"Increment"},"widget_override":"number"},{"input_data":{"blank_assist":true,"mode":"Increment","min":2.0,"is_integer":true},"widget_override":"number"},{"input_data":{"blank_assist":true,"unit":" px","is_integer":false,"mode":"Increment","min":0.0},"widget_override":"number"},{"input_data":{"mode":"Increment","min":0.0,"blank_assist":true,"is_integer":false,"unit":" px"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16598825029377599083,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"is_integer":false,"min":0.0,"blank_assist":true,"mode":"Increment","unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":true,"min":2.0,"mode":"Increment","blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"mode":"Increment","unit":" px","min":0.0},"widget_override":"number"},{"input_data":{"mode":"Increment","blank_assist":true,"min":0.0,"unit":" px","is_integer":false},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[640915213983348287,{"persistent_metadata":{"reference":"Rectangle","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"Width"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Individual Corner Radii"},"widget_override":null},{"input_data":{"input_name":"Corner Radius"},"widget_override":null},{"input_data":{"input_name":"Clamped"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-27,-3]}}},"network_metadata":null}}],[1791308547102433540,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-20,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,991.0,581.0],"node_graph_top_right":[1980.796875,0.0]},"selection_undo_history":[[]],"selection_redo_history":[]}}}}],[7711570794020903773,{"persistent_metadata":{"reference":null,"display_name":"Dune","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":"Color"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":[""],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1126802566044359983,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"mode":"Increment","blank_assist":true,"min":0.0,"unit":" px","is_integer":false},"widget_override":"number"},{"input_data":{"blank_assist":true,"min":2.0,"mode":"Increment","is_integer":true},"widget_override":"number"},{"input_data":{"mode":"Increment","blank_assist":true,"unit":" px","min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{"is_integer":false,"min":0.0,"mode":"Increment","unit":" px","blank_assist":true},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[3025883099767376126,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"min":0.0,"blank_assist":true,"unit":" px","is_integer":false,"mode":"Increment"},"widget_override":"number"},{"input_data":{"mode":"Increment","blank_assist":true,"is_integer":true,"min":2.0},"widget_override":"number"},{"input_data":{"blank_assist":true,"mode":"Increment","unit":" px","is_integer":false,"min":0.0},"widget_override":"number"},{"input_data":{"is_integer":false,"unit":" px","min":0.0,"mode":"Increment","blank_assist":true},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[640915213983348287,{"persistent_metadata":{"reference":"Rectangle","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"Width"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Individual Corner Radii"},"widget_override":null},{"input_data":{"input_name":"Corner Radius"},"widget_override":null},{"input_data":{"input_name":"Clamped"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-27,-3]}}},"network_metadata":null}}],[2288754089236120499,{"persistent_metadata":{"reference":"Spline","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[22,-3]}}},"network_metadata":null}}],[7828034197076821310,{"persistent_metadata":{"reference":"To u32","display_name":"","input_properties":[{"input_data":{"input_name":"Value"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,1]}}},"network_metadata":null}}],[16943732999059587742,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-3]}}},"network_metadata":null}}],[14577956936089455769,{"persistent_metadata":{"reference":"Coordinate Value","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"X"},"widget_override":null},{"input_data":{"input_name":"Y"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-1]}}},"network_metadata":null}}],[11731553664207576737,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-6,-3]}}},"network_metadata":null}}],[1791308547102433540,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-20,-3]}}},"network_metadata":null}}],[14158287945315818946,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"y":"Y","unit":" px","input_name":"Translation","x":"X"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"y":"H","x":"W","input_name":"Scale","unit":"x"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"transform_skew"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":["Data"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[15,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,991.0,581.0],"node_graph_top_right":[1980.796875,0.0]},"selection_undo_history":[[]],"selection_redo_history":[]}}}}],[1801066723091712434,{"persistent_metadata":{"reference":null,"display_name":"Dune","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":"Color"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":[""],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[640915213983348287,{"persistent_metadata":{"reference":"Rectangle","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"Width"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Individual Corner Radii"},"widget_override":null},{"input_data":{"input_name":"Corner Radius"},"widget_override":null},{"input_data":{"input_name":"Clamped"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-27,-3]}}},"network_metadata":null}}],[16943732999059587742,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-3]}}},"network_metadata":null}}],[11731553664207576737,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-6,-3]}}},"network_metadata":null}}],[2288754089236120499,{"persistent_metadata":{"reference":"Spline","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[22,-3]}}},"network_metadata":null}}],[7828034197076821310,{"persistent_metadata":{"reference":"To u32","display_name":"","input_properties":[{"input_data":{"input_name":"Value"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,1]}}},"network_metadata":null}}],[1791308547102433540,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-20,-3]}}},"network_metadata":null}}],[14514477720912258595,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"blank_assist":true,"is_integer":false,"min":0.0,"unit":" px","mode":"Increment"},"widget_override":"number"},{"input_data":{"blank_assist":true,"min":2.0,"is_integer":true,"mode":"Increment"},"widget_override":"number"},{"input_data":{"min":0.0,"blank_assist":true,"mode":"Increment","is_integer":false,"unit":" px"},"widget_override":"number"},{"input_data":{"mode":"Increment","is_integer":false,"blank_assist":true,"unit":" px","min":0.0},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14577956936089455769,{"persistent_metadata":{"reference":"Coordinate Value","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"X"},"widget_override":null},{"input_data":{"input_name":"Y"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-1]}}},"network_metadata":null}}],[14158287945315818946,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"unit":" px","x":"X","y":"Y","input_name":"Translation"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"x":"W","unit":"x","y":"H","input_name":"Scale"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"transform_skew"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":["Data"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[15,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[18341697272814101120,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"blank_assist":true,"mode":"Increment","min":0.0,"unit":" px","is_integer":false},"widget_override":"number"},{"input_data":{"mode":"Increment","blank_assist":true,"is_integer":true,"min":2.0},"widget_override":"number"},{"input_data":{"min":0.0,"is_integer":false,"blank_assist":true,"unit":" px","mode":"Increment"},"widget_override":"number"},{"input_data":{"mode":"Increment","min":0.0,"is_integer":false,"unit":" px","blank_assist":true},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[17.0,-79.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,1008.0,502.0],"node_graph_top_right":[1980.796875,0.0]},"selection_undo_history":[[]],"selection_redo_history":[]}}}}],[7128559142392931896,{"persistent_metadata":{"reference":null,"display_name":"Dune","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":"Color"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":[""],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[640915213983348287,{"persistent_metadata":{"reference":"Rectangle","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"Width"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Individual Corner Radii"},"widget_override":null},{"input_data":{"input_name":"Corner Radius"},"widget_override":null},{"input_data":{"input_name":"Clamped"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-27,-3]}}},"network_metadata":null}}],[1791308547102433540,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-20,-3]}}},"network_metadata":null}}],[14158287945315818946,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"unit":" px","y":"Y","x":"X","input_name":"Translation"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"unit":"x","y":"H","input_name":"Scale","x":"W"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"transform_skew"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":["Data"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[15,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14577956936089455769,{"persistent_metadata":{"reference":"Coordinate Value","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"X"},"widget_override":null},{"input_data":{"input_name":"Y"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-1]}}},"network_metadata":null}}],[16943732999059587742,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-3]}}},"network_metadata":null}}],[18443039976647938912,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"mode":"Increment","blank_assist":true,"unit":" px","min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{"min":2.0,"mode":"Increment","is_integer":true,"blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"mode":"Increment","min":0.0,"unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":false,"unit":" px","blank_assist":true,"min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2288754089236120499,{"persistent_metadata":{"reference":"Spline","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[22,-3]}}},"network_metadata":null}}],[11731553664207576737,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-6,-3]}}},"network_metadata":null}}],[7828034197076821310,{"persistent_metadata":{"reference":"To u32","display_name":"","input_properties":[{"input_data":{"input_name":"Value"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,1]}}},"network_metadata":null}}],[10094915787292727725,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"mode":"Increment","blank_assist":true,"unit":" px","min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{"min":2.0,"mode":"Increment","is_integer":true,"blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"mode":"Increment","min":0.0,"unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":false,"unit":" px","blank_assist":true,"min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.33333333333328596,-0.3333333333333428],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,991.0,580.0],"node_graph_top_right":[1980.796875,0.0]},"selection_undo_history":[[10094915787292727725]],"selection_redo_history":[]}}}}],[17437077810654043142,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"mode":"Increment","blank_assist":true,"is_integer":false,"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","input_name":"Spacing","unit":" px","min":1.0},"widget_override":"number"},{"input_data":{"tooltip":"Exclude some distance from the start of the path before the first instance","unit":" px","mode":"Increment","min":0.0,"blank_assist":true,"input_name":"Start Offset","is_integer":false},"widget_override":"number"},{"input_data":{"input_name":"Stop Offset","blank_assist":true,"is_integer":false,"min":0.0,"tooltip":"Exclude some distance from the end of the path after the last instance","mode":"Increment","unit":" px"},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13323241418027154136,{"persistent_metadata":{"reference":null,"display_name":"Dune","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":"Color"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":[""],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[11731553664207576737,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-6,-3]}}},"network_metadata":null}}],[640915213983348287,{"persistent_metadata":{"reference":"Rectangle","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"Width"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Individual Corner Radii"},"widget_override":null},{"input_data":{"input_name":"Corner Radius"},"widget_override":null},{"input_data":{"input_name":"Clamped"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-27,-3]}}},"network_metadata":null}}],[14158287945315818946,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"unit":" px","y":"Y","input_name":"Translation","x":"X"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"input_name":"Scale","unit":"x","y":"H","x":"W"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"transform_skew"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":["Data"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[15,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2288754089236120499,{"persistent_metadata":{"reference":"Spline","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[22,-3]}}},"network_metadata":null}}],[7828034197076821310,{"persistent_metadata":{"reference":"To u32","display_name":"","input_properties":[{"input_data":{"input_name":"Value"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,1]}}},"network_metadata":null}}],[16504069171520924548,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"unit":" px","min":0.0,"is_integer":false,"blank_assist":true,"mode":"Increment"},"widget_override":"number"},{"input_data":{"mode":"Increment","is_integer":true,"blank_assist":true,"min":2.0},"widget_override":"number"},{"input_data":{"min":0.0,"blank_assist":true,"mode":"Increment","is_integer":false,"unit":" px"},"widget_override":"number"},{"input_data":{"min":0.0,"is_integer":false,"unit":" px","blank_assist":true,"mode":"Increment"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14577956936089455769,{"persistent_metadata":{"reference":"Coordinate Value","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"X"},"widget_override":null},{"input_data":{"input_name":"Y"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-1]}}},"network_metadata":null}}],[16943732999059587742,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-3]}}},"network_metadata":null}}],[1791308547102433540,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-20,-3]}}},"network_metadata":null}}],[3434804841107735149,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"blank_assist":true,"unit":" px","min":0.0,"is_integer":false,"mode":"Increment"},"widget_override":"number"},{"input_data":{"blank_assist":true,"min":2.0,"mode":"Increment","is_integer":true},"widget_override":"number"},{"input_data":{"min":0.0,"mode":"Increment","unit":" px","is_integer":false,"blank_assist":true},"widget_override":"number"},{"input_data":{"min":0.0,"mode":"Increment","unit":" px","blank_assist":true,"is_integer":false},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[26.0,-82.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,1017.0,499.0],"node_graph_top_right":[1980.796875,0.0]},"selection_undo_history":[[]],"selection_redo_history":[]}}}}],[15002088321732485705,{"persistent_metadata":{"reference":null,"display_name":"Dune","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":"Color"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":[""],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1791308547102433540,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-20,-3]}}},"network_metadata":null}}],[11731553664207576737,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-6,-3]}}},"network_metadata":null}}],[640915213983348287,{"persistent_metadata":{"reference":"Rectangle","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"Width"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Individual Corner Radii"},"widget_override":null},{"input_data":{"input_name":"Corner Radius"},"widget_override":null},{"input_data":{"input_name":"Clamped"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-27,-3]}}},"network_metadata":null}}],[15212962088799153943,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"unit":" px","min":0.0,"is_integer":false,"mode":"Increment","blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":true,"blank_assist":true,"mode":"Increment","min":2.0},"widget_override":"number"},{"input_data":{"mode":"Increment","min":0.0,"is_integer":false,"blank_assist":true,"unit":" px"},"widget_override":"number"},{"input_data":{"min":0.0,"blank_assist":true,"unit":" px","mode":"Increment","is_integer":false},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16943732999059587742,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-3]}}},"network_metadata":null}}],[2288754089236120499,{"persistent_metadata":{"reference":"Spline","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[22,-3]}}},"network_metadata":null}}],[7828034197076821310,{"persistent_metadata":{"reference":"To u32","display_name":"","input_properties":[{"input_data":{"input_name":"Value"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,1]}}},"network_metadata":null}}],[8591396027454826376,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"min":0.0,"mode":"Increment","unit":" px","blank_assist":true,"is_integer":false},"widget_override":"number"},{"input_data":{"min":2.0,"blank_assist":true,"is_integer":true,"mode":"Increment"},"widget_override":"number"},{"input_data":{"blank_assist":true,"mode":"Increment","min":0.0,"unit":" px","is_integer":false},"widget_override":"number"},{"input_data":{"blank_assist":true,"min":0.0,"mode":"Increment","unit":" px","is_integer":false},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14577956936089455769,{"persistent_metadata":{"reference":"Coordinate Value","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"X"},"widget_override":null},{"input_data":{"input_name":"Y"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-1]}}},"network_metadata":null}}],[14158287945315818946,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"unit":" px","x":"X","y":"Y","input_name":"Translation"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"unit":"x","x":"W","input_name":"Scale","y":"H"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"transform_skew"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":["Data"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[15,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,991.0,581.0],"node_graph_top_right":[1980.796875,0.0]},"selection_undo_history":[[]],"selection_redo_history":[]}}}}],[239716716021064150,{"persistent_metadata":{"reference":"Merge","display_name":"Dune 2","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":["Out"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16611856724057842399,{"persistent_metadata":{"reference":null,"display_name":"Dune","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":"Color"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":[""],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[7828034197076821310,{"persistent_metadata":{"reference":"To u32","display_name":"","input_properties":[{"input_data":{"input_name":"Value"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,1]}}},"network_metadata":null}}],[14577956936089455769,{"persistent_metadata":{"reference":"Coordinate Value","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"X"},"widget_override":null},{"input_data":{"input_name":"Y"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-1]}}},"network_metadata":null}}],[1791308547102433540,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-20,-3]}}},"network_metadata":null}}],[640915213983348287,{"persistent_metadata":{"reference":"Rectangle","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"Width"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Individual Corner Radii"},"widget_override":null},{"input_data":{"input_name":"Corner Radius"},"widget_override":null},{"input_data":{"input_name":"Clamped"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-27,-3]}}},"network_metadata":null}}],[11731553664207576737,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-6,-3]}}},"network_metadata":null}}],[17232801702996970986,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"blank_assist":true,"min":0.0,"is_integer":false,"unit":" px","mode":"Increment"},"widget_override":"number"},{"input_data":{"is_integer":true,"mode":"Increment","min":2.0,"blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"unit":" px","mode":"Increment","min":0.0,"blank_assist":true},"widget_override":"number"},{"input_data":{"min":0.0,"unit":" px","is_integer":false,"blank_assist":true,"mode":"Increment"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2288754089236120499,{"persistent_metadata":{"reference":"Spline","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[22,-3]}}},"network_metadata":null}}],[14158287945315818946,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"unit":" px","x":"X","input_name":"Translation","y":"Y"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"unit":"x","x":"W","input_name":"Scale","y":"H"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"transform_skew"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":["Data"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[15,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16943732999059587742,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-3]}}},"network_metadata":null}}],[9065988052616974602,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"mode":"Increment","blank_assist":true,"unit":" px","min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{"blank_assist":true,"is_integer":true,"min":2.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{"unit":" px","is_integer":false,"blank_assist":true,"mode":"Increment","min":0.0},"widget_override":"number"},{"input_data":{"unit":" px","mode":"Increment","blank_assist":true,"min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,991.0,581.0],"node_graph_top_right":[1980.796875,0.0]},"selection_undo_history":[[]],"selection_redo_history":[]}}}}],[4037968351431607570,{"persistent_metadata":{"reference":null,"display_name":"Dune","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":"Color"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":[""],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[14577956936089455769,{"persistent_metadata":{"reference":"Coordinate Value","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"X"},"widget_override":null},{"input_data":{"input_name":"Y"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-1]}}},"network_metadata":null}}],[7828034197076821310,{"persistent_metadata":{"reference":"To u32","display_name":"","input_properties":[{"input_data":{"input_name":"Value"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,1]}}},"network_metadata":null}}],[7807438675023750219,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"blank_assist":true,"is_integer":false,"unit":" px","min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{"mode":"Increment","is_integer":true,"blank_assist":true,"min":2.0},"widget_override":"number"},{"input_data":{"min":0.0,"mode":"Increment","is_integer":false,"blank_assist":true,"unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":false,"mode":"Increment","min":0.0,"unit":" px","blank_assist":true},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2288754089236120499,{"persistent_metadata":{"reference":"Spline","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[22,-3]}}},"network_metadata":null}}],[11731553664207576737,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-6,-3]}}},"network_metadata":null}}],[16943732999059587742,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-3]}}},"network_metadata":null}}],[1791308547102433540,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-20,-3]}}},"network_metadata":null}}],[11874141024063691837,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"unit":" px","min":0.0,"blank_assist":true,"is_integer":false,"mode":"Increment"},"widget_override":"number"},{"input_data":{"mode":"Increment","is_integer":true,"blank_assist":true,"min":2.0},"widget_override":"number"},{"input_data":{"min":0.0,"blank_assist":true,"mode":"Increment","is_integer":false,"unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":false,"mode":"Increment","blank_assist":true,"unit":" px","min":0.0},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[640915213983348287,{"persistent_metadata":{"reference":"Rectangle","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"Width"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Individual Corner Radii"},"widget_override":null},{"input_data":{"input_name":"Corner Radius"},"widget_override":null},{"input_data":{"input_name":"Clamped"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-27,-3]}}},"network_metadata":null}}],[14158287945315818946,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"y":"Y","input_name":"Translation","unit":" px","x":"X"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"y":"H","input_name":"Scale","x":"W","unit":"x"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"transform_skew"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":["Data"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[15,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,991.0,581.0],"node_graph_top_right":[1980.796875,0.0]},"selection_undo_history":[[]],"selection_redo_history":[]}}}}],[12110920487474373676,{"persistent_metadata":{"reference":"Merge","display_name":"Dune in Shadow 2","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":["Out"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13676600738025998635,{"persistent_metadata":{"reference":"Merge","display_name":"Background","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":["Out"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":10}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[6523786079462141312,{"persistent_metadata":{"reference":null,"display_name":"Dune","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":"Color"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":[""],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2288754089236120499,{"persistent_metadata":{"reference":"Spline","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[22,-3]}}},"network_metadata":null}}],[16009834030113172488,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"mode":"Increment","is_integer":false,"min":0.0,"unit":" px","blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":true,"mode":"Increment","blank_assist":true,"min":2.0},"widget_override":"number"},{"input_data":{"min":0.0,"unit":" px","is_integer":false,"mode":"Increment","blank_assist":true},"widget_override":"number"},{"input_data":{"min":0.0,"is_integer":false,"unit":" px","blank_assist":true,"mode":"Increment"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[7828034197076821310,{"persistent_metadata":{"reference":"To u32","display_name":"","input_properties":[{"input_data":{"input_name":"Value"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,1]}}},"network_metadata":null}}],[14577956936089455769,{"persistent_metadata":{"reference":"Coordinate Value","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"X"},"widget_override":null},{"input_data":{"input_name":"Y"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-1]}}},"network_metadata":null}}],[1791308547102433540,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-20,-3]}}},"network_metadata":null}}],[14158287945315818946,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"y":"Y","x":"X","unit":" px","input_name":"Translation"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"x":"W","unit":"x","input_name":"Scale","y":"H"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"transform_skew"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":["Data"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[15,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11731553664207576737,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-6,-3]}}},"network_metadata":null}}],[7783268010546120518,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"unit":" px","min":0.0,"is_integer":false,"blank_assist":true,"mode":"Increment"},"widget_override":"number"},{"input_data":{"is_integer":true,"blank_assist":true,"mode":"Increment","min":2.0},"widget_override":"number"},{"input_data":{"unit":" px","is_integer":false,"min":0.0,"mode":"Increment","blank_assist":true},"widget_override":"number"},{"input_data":{"blank_assist":true,"mode":"Increment","unit":" px","min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16943732999059587742,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-3]}}},"network_metadata":null}}],[640915213983348287,{"persistent_metadata":{"reference":"Rectangle","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"Width"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Individual Corner Radii"},"widget_override":null},{"input_data":{"input_name":"Corner Radius"},"widget_override":null},{"input_data":{"input_name":"Clamped"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-27,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,991.0,581.0],"node_graph_top_right":[1980.796875,0.0]},"selection_undo_history":[[]],"selection_redo_history":[]}}}}],[17239043462037837834,{"persistent_metadata":{"reference":null,"display_name":"Dune","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":"Color"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":[""],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[15937218612227302315,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"unit":" px","blank_assist":true,"is_integer":false,"min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{"mode":"Increment","blank_assist":true,"min":2.0,"is_integer":true},"widget_override":"number"},{"input_data":{"mode":"Increment","unit":" px","blank_assist":true,"min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{"is_integer":false,"min":0.0,"mode":"Increment","blank_assist":true,"unit":" px"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[7260397085903590160,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"unit":" px","is_integer":false,"mode":"Increment","blank_assist":true,"min":0.0},"widget_override":"number"},{"input_data":{"min":2.0,"is_integer":true,"mode":"Increment","blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"min":0.0,"mode":"Increment","unit":" px"},"widget_override":"number"},{"input_data":{"unit":" px","is_integer":false,"blank_assist":true,"min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14577956936089455769,{"persistent_metadata":{"reference":"Coordinate Value","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"X"},"widget_override":null},{"input_data":{"input_name":"Y"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-1]}}},"network_metadata":null}}],[2288754089236120499,{"persistent_metadata":{"reference":"Spline","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[22,-3]}}},"network_metadata":null}}],[1791308547102433540,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-20,-3]}}},"network_metadata":null}}],[11731553664207576737,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-6,-3]}}},"network_metadata":null}}],[640915213983348287,{"persistent_metadata":{"reference":"Rectangle","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"Width"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Individual Corner Radii"},"widget_override":null},{"input_data":{"input_name":"Corner Radius"},"widget_override":null},{"input_data":{"input_name":"Clamped"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-27,-3]}}},"network_metadata":null}}],[14158287945315818946,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Translation","y":"Y","unit":" px","x":"X"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"y":"H","unit":"x","input_name":"Scale","x":"W"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"transform_skew"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":["Data"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[15,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[7828034197076821310,{"persistent_metadata":{"reference":"To u32","display_name":"","input_properties":[{"input_data":{"input_name":"Value"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,1]}}},"network_metadata":null}}],[16943732999059587742,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,991.0,581.0],"node_graph_top_right":[1980.796875,0.0]},"selection_undo_history":[[]],"selection_redo_history":[]}}}}],[10806978668166337270,{"persistent_metadata":{"reference":null,"display_name":"Dune","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":"Color"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":[""],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[9133354469966676056,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"mode":"Increment","min":0.0,"is_integer":false,"blank_assist":true,"unit":" px"},"widget_override":"number"},{"input_data":{"min":2.0,"blank_assist":true,"is_integer":true,"mode":"Increment"},"widget_override":"number"},{"input_data":{"mode":"Increment","min":0.0,"is_integer":false,"unit":" px","blank_assist":true},"widget_override":"number"},{"input_data":{"min":0.0,"unit":" px","is_integer":false,"mode":"Increment","blank_assist":true},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[1791308547102433540,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-20,-3]}}},"network_metadata":null}}],[11731553664207576737,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-6,-3]}}},"network_metadata":null}}],[7828034197076821310,{"persistent_metadata":{"reference":"To u32","display_name":"","input_properties":[{"input_data":{"input_name":"Value"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,1]}}},"network_metadata":null}}],[3765311973789472189,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"unit":" px","blank_assist":true,"min":0.0,"is_integer":false,"mode":"Increment"},"widget_override":"number"},{"input_data":{"mode":"Increment","min":2.0,"is_integer":true,"blank_assist":true},"widget_override":"number"},{"input_data":{"min":0.0,"mode":"Increment","is_integer":false,"unit":" px","blank_assist":true},"widget_override":"number"},{"input_data":{"mode":"Increment","is_integer":false,"blank_assist":true,"min":0.0,"unit":" px"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[640915213983348287,{"persistent_metadata":{"reference":"Rectangle","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"Width"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Individual Corner Radii"},"widget_override":null},{"input_data":{"input_name":"Corner Radius"},"widget_override":null},{"input_data":{"input_name":"Clamped"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-27,-3]}}},"network_metadata":null}}],[14158287945315818946,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"unit":" px","y":"Y","input_name":"Translation","x":"X"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"y":"H","x":"W","unit":"x","input_name":"Scale"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"transform_skew"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":["Data"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[15,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14577956936089455769,{"persistent_metadata":{"reference":"Coordinate Value","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"X"},"widget_override":null},{"input_data":{"input_name":"Y"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-1]}}},"network_metadata":null}}],[2288754089236120499,{"persistent_metadata":{"reference":"Spline","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[22,-3]}}},"network_metadata":null}}],[16943732999059587742,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,991.0,581.0],"node_graph_top_right":[1980.796875,0.0]},"selection_undo_history":[[]],"selection_redo_history":[]}}}}],[8804763001225416124,{"persistent_metadata":{"reference":"Merge","display_name":"Dune in Shadow 4","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":["Out"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13132104524813958174,{"persistent_metadata":{"reference":"Merge","display_name":"Foreground","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":["Out"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Absolute":[-4,3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[3934928477288442109,{"persistent_metadata":{"reference":"Merge","display_name":"Dune 1","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":["Out"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15385259560644295534,{"persistent_metadata":{"reference":"Merge","display_name":"Dune 2","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":["Out"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10686861494573327243,{"persistent_metadata":{"reference":"Merge","display_name":"Dune in Shadow 2","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":["Out"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[17589660903986237301,{"persistent_metadata":{"reference":null,"display_name":"Dune","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":"Color"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":[""],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[12029121808718862100,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"min":0.0,"mode":"Increment","blank_assist":true,"unit":" px","is_integer":false},"widget_override":"number"},{"input_data":{"mode":"Increment","min":2.0,"blank_assist":true,"is_integer":true},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"min":0.0,"unit":" px","mode":"Increment"},"widget_override":"number"},{"input_data":{"min":0.0,"unit":" px","mode":"Increment","blank_assist":true,"is_integer":false},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[1791308547102433540,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-20,-3]}}},"network_metadata":null}}],[14577956936089455769,{"persistent_metadata":{"reference":"Coordinate Value","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"X"},"widget_override":null},{"input_data":{"input_name":"Y"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-1]}}},"network_metadata":null}}],[11731553664207576737,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-6,-3]}}},"network_metadata":null}}],[14158287945315818946,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"x":"X","y":"Y","input_name":"Translation","unit":" px"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"input_name":"Scale","unit":"x","x":"W","y":"H"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"transform_skew"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":["Data"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[15,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[3289411516263327806,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"blank_assist":true,"is_integer":false,"min":0.0,"unit":" px","mode":"Increment"},"widget_override":"number"},{"input_data":{"min":2.0,"mode":"Increment","blank_assist":true,"is_integer":true},"widget_override":"number"},{"input_data":{"blank_assist":true,"is_integer":false,"mode":"Increment","min":0.0,"unit":" px"},"widget_override":"number"},{"input_data":{"mode":"Increment","is_integer":false,"unit":" px","min":0.0,"blank_assist":true},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[640915213983348287,{"persistent_metadata":{"reference":"Rectangle","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"Width"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Individual Corner Radii"},"widget_override":null},{"input_data":{"input_name":"Corner Radius"},"widget_override":null},{"input_data":{"input_name":"Clamped"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-27,-3]}}},"network_metadata":null}}],[7828034197076821310,{"persistent_metadata":{"reference":"To u32","display_name":"","input_properties":[{"input_data":{"input_name":"Value"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,1]}}},"network_metadata":null}}],[2288754089236120499,{"persistent_metadata":{"reference":"Spline","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[22,-3]}}},"network_metadata":null}}],[16943732999059587742,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,991.0,581.0],"node_graph_top_right":[1980.796875,0.0]},"selection_undo_history":[[]],"selection_redo_history":[]}}}}],[4445985685181725042,{"persistent_metadata":{"reference":"Artboard","display_name":"","input_properties":[{"input_data":{"input_name":"Artboards"},"widget_override":null},{"input_data":{"input_name":"Contents"},"widget_override":"hidden"},{"input_data":{"input_name":"Location","unit":" px","x":"X","y":"Y"},"widget_override":"vec2"},{"input_data":{"input_name":"Dimensions","x":"W","y":"H","unit":" px"},"widget_override":"vec2"},{"input_data":{"input_name":"Background"},"widget_override":"artboard_background"},{"input_data":{"input_name":"Clip"},"widget_override":null}],"output_names":["Out"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Absolute":[3,0]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-2,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Artboard","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-10,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Append Artboards","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[6,-4]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[9069881382900058607,{"persistent_metadata":{"reference":"Merge","display_name":"Dune 5","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":["Out"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13644002059194136823,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[6097807941755042226,{"persistent_metadata":{"reference":"Merge","display_name":"Dune 1","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":["Out"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Absolute":[-14,40]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[12639486733043466090,{"persistent_metadata":{"reference":"Merge","display_name":"Dune in Shadow 3","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":["Out"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[3726756269632080543,{"persistent_metadata":{"reference":null,"display_name":"Dune","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":"Color"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":[""],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1791308547102433540,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-20,-3]}}},"network_metadata":null}}],[5294703684886212416,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"mode":"Increment","min":0.0,"blank_assist":true,"is_integer":false,"unit":" px"},"widget_override":"number"},{"input_data":{"min":2.0,"blank_assist":true,"is_integer":true,"mode":"Increment"},"widget_override":"number"},{"input_data":{"min":0.0,"is_integer":false,"mode":"Increment","unit":" px","blank_assist":true},"widget_override":"number"},{"input_data":{"blank_assist":true,"is_integer":false,"min":0.0,"unit":" px","mode":"Increment"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[640915213983348287,{"persistent_metadata":{"reference":"Rectangle","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"Width"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Individual Corner Radii"},"widget_override":null},{"input_data":{"input_name":"Corner Radius"},"widget_override":null},{"input_data":{"input_name":"Clamped"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-27,-3]}}},"network_metadata":null}}],[11731553664207576737,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-6,-3]}}},"network_metadata":null}}],[14158287945315818946,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Translation","x":"X","unit":" px","y":"Y"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"x":"W","input_name":"Scale","y":"H","unit":"x"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"transform_skew"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":["Data"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[15,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[7419291594083587754,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"blank_assist":true,"is_integer":false,"mode":"Increment","unit":" px","min":0.0},"widget_override":"number"},{"input_data":{"blank_assist":true,"min":2.0,"is_integer":true,"mode":"Increment"},"widget_override":"number"},{"input_data":{"mode":"Increment","is_integer":false,"min":0.0,"blank_assist":true,"unit":" px"},"widget_override":"number"},{"input_data":{"blank_assist":true,"min":0.0,"mode":"Increment","unit":" px","is_integer":false},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2288754089236120499,{"persistent_metadata":{"reference":"Spline","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[22,-3]}}},"network_metadata":null}}],[16943732999059587742,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-3]}}},"network_metadata":null}}],[14577956936089455769,{"persistent_metadata":{"reference":"Coordinate Value","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"X"},"widget_override":null},{"input_data":{"input_name":"Y"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-1]}}},"network_metadata":null}}],[7828034197076821310,{"persistent_metadata":{"reference":"To u32","display_name":"","input_properties":[{"input_data":{"input_name":"Value"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,991.0,581.0],"node_graph_top_right":[1980.796875,0.0]},"selection_undo_history":[[]],"selection_redo_history":[]}}}}],[17154757625902243313,{"persistent_metadata":{"reference":null,"display_name":"Dune","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":"Color"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":[""],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[16943732999059587742,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-3]}}},"network_metadata":null}}],[1791308547102433540,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-20,-3]}}},"network_metadata":null}}],[1357621220363171879,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"min":0.0,"unit":" px","blank_assist":true,"is_integer":false,"mode":"Increment"},"widget_override":"number"},{"input_data":{"blank_assist":true,"min":2.0,"is_integer":true,"mode":"Increment"},"widget_override":"number"},{"input_data":{"min":0.0,"blank_assist":true,"mode":"Increment","is_integer":false,"unit":" px"},"widget_override":"number"},{"input_data":{"min":0.0,"blank_assist":true,"is_integer":false,"mode":"Increment","unit":" px"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14577956936089455769,{"persistent_metadata":{"reference":"Coordinate Value","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"X"},"widget_override":null},{"input_data":{"input_name":"Y"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-1]}}},"network_metadata":null}}],[640915213983348287,{"persistent_metadata":{"reference":"Rectangle","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"Width"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Individual Corner Radii"},"widget_override":null},{"input_data":{"input_name":"Corner Radius"},"widget_override":null},{"input_data":{"input_name":"Clamped"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-27,-3]}}},"network_metadata":null}}],[2288754089236120499,{"persistent_metadata":{"reference":"Spline","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[22,-3]}}},"network_metadata":null}}],[7828034197076821310,{"persistent_metadata":{"reference":"To u32","display_name":"","input_properties":[{"input_data":{"input_name":"Value"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,1]}}},"network_metadata":null}}],[14158287945315818946,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"unit":" px","x":"X","input_name":"Translation","y":"Y"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"y":"H","unit":"x","input_name":"Scale","x":"W"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"transform_skew"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":["Data"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[15,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[757876048866560520,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"min":0.0,"is_integer":false,"blank_assist":true,"unit":" px","mode":"Increment"},"widget_override":"number"},{"input_data":{"mode":"Increment","blank_assist":true,"is_integer":true,"min":2.0},"widget_override":"number"},{"input_data":{"blank_assist":true,"mode":"Increment","is_integer":false,"unit":" px","min":0.0},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"mode":"Increment","min":0.0,"unit":" px"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11731553664207576737,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-6,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,991.0,581.0],"node_graph_top_right":[1980.796875,0.0]},"selection_undo_history":[[]],"selection_redo_history":[]}}}}],[4390668436091073484,{"persistent_metadata":{"reference":"Merge","display_name":"Midground in Shadow","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":["Out"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":18}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11386926595254122633,{"persistent_metadata":{"reference":"Merge","display_name":"Dune","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":["Out"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[12416569579970107543,{"persistent_metadata":{"reference":"Spline","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[3683309254695891012,{"persistent_metadata":{"reference":null,"display_name":"Dune","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":"Color"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":[""],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[14577956936089455769,{"persistent_metadata":{"reference":"Coordinate Value","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"X"},"widget_override":null},{"input_data":{"input_name":"Y"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-1]}}},"network_metadata":null}}],[11731553664207576737,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-6,-3]}}},"network_metadata":null}}],[7828034197076821310,{"persistent_metadata":{"reference":"To u32","display_name":"","input_properties":[{"input_data":{"input_name":"Value"},"widget_override":null}],"output_names":["Future"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,1]}}},"network_metadata":null}}],[10720574559271598132,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"mode":"Increment","blank_assist":true,"unit":" px","min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{"is_integer":true,"min":2.0,"mode":"Increment","blank_assist":true},"widget_override":"number"},{"input_data":{"min":0.0,"is_integer":false,"mode":"Increment","unit":" px","blank_assist":true},"widget_override":"number"},{"input_data":{"mode":"Increment","is_integer":false,"unit":" px","blank_assist":true,"min":0.0},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[3916070947050514908,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"min":0.0,"mode":"Increment","is_integer":false,"blank_assist":true,"unit":" px"},"widget_override":"number"},{"input_data":{"blank_assist":true,"min":2.0,"is_integer":true,"mode":"Increment"},"widget_override":"number"},{"input_data":{"unit":" px","blank_assist":true,"mode":"Increment","is_integer":false,"min":0.0},"widget_override":"number"},{"input_data":{"blank_assist":true,"mode":"Increment","is_integer":false,"min":0.0,"unit":" px"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-13,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[640915213983348287,{"persistent_metadata":{"reference":"Rectangle","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"Width"},"widget_override":null},{"input_data":{"input_name":"Height"},"widget_override":null},{"input_data":{"input_name":"Individual Corner Radii"},"widget_override":null},{"input_data":{"input_name":"Corner Radius"},"widget_override":null},{"input_data":{"input_name":"Clamped"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-27,-3]}}},"network_metadata":null}}],[16943732999059587742,{"persistent_metadata":{"reference":"Jitter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Amount"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[8,-3]}}},"network_metadata":null}}],[2288754089236120499,{"persistent_metadata":{"reference":"Spline","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[22,-3]}}},"network_metadata":null}}],[1791308547102433540,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":["Future>"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-20,-3]}}},"network_metadata":null}}],[14158287945315818946,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"unit":" px","y":"Y","input_name":"Translation","x":"X"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"y":"H","unit":"x","x":"W","input_name":"Scale"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"transform_skew"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":["Data"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[15,-3]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,991.0,581.0],"node_graph_top_right":[1980.796875,0.0]},"selection_undo_history":[[]],"selection_redo_history":[]}}}}],[12317719117993811200,{"persistent_metadata":{"reference":"Merge","display_name":"Dune 4","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":["Out"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2128810469968776913,{"persistent_metadata":{"reference":"Merge","display_name":"Far Mountains","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":["Out"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":16}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2163528024003768644,{"persistent_metadata":{"reference":"Merge","display_name":"Dune in Shadow 1","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":["Out"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Absolute":[-14,6]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[12122314434656187176,{"persistent_metadata":{"reference":"Merge","display_name":"Dune in Shadow 1","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":["Out"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Absolute":[-14,27]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[393.8840949272409,-703.048313613491],"tilt":0.0,"zoom":0.7533811475409836,"flip":false},"node_graph_to_viewport":[0.7533811475409836,0.0,0.0,0.7533811475409836,1287.0,51.0],"node_graph_top_right":[1980.796875,0.0]},"selection_undo_history":[[6097807941755042226,15385259560644295534,17327221498641745184,12317719117993811200,9069881382900058607],[17327221498641745184],[6097807941755042226,15385259560644295534,17327221498641745184,12317719117993811200,9069881382900058607],[6097807941755042226,5883606306991910210,2128810469968776913,12416569579970107543,13644002059194136823,17437077810654043142,15002088321732485705],[6097807941755042226,15385259560644295534,17327221498641745184,12317719117993811200,9069881382900058607],[2128810469968776913],[6097807941755042226,15385259560644295534,17327221498641745184,12317719117993811200,9069881382900058607],[15385259560644295534],[6097807941755042226,15385259560644295534,17327221498641745184,12317719117993811200,9069881382900058607],[2128810469968776913,12416569579970107543,13644002059194136823,17437077810654043142,15002088321732485705],[6097807941755042226,15385259560644295534,17327221498641745184,12317719117993811200,9069881382900058607],[13676600738025998635],[2128810469968776913],[11435147660766496741],[15726496377243608372],[4390668436091073484],[11386926595254122633],[11435147660766496741],[15726496377243608372],[15726496377243608372,11435147660766496741,2163528024003768644,12110920487474373676,12639486733043466090,8804763001225416124],[11435147660766496741,2163528024003768644,12110920487474373676,12639486733043466090,8804763001225416124,15726496377243608372],[11435147660766496741],[11435147660766496741,2163528024003768644,12110920487474373676,12639486733043466090,8804763001225416124,15726496377243608372],[11435147660766496741,15726496377243608372,4390668436091073484,11386926595254122633,13676600738025998635,2128810469968776913],[11435147660766496741,2163528024003768644,12110920487474373676,12639486733043466090,8804763001225416124,15726496377243608372],[11435147660766496741],[11435147660766496741,2163528024003768644,12110920487474373676,12639486733043466090,8804763001225416124,15726496377243608372],[4390668436091073484,11386926595254122633,13676600738025998635,2128810469968776913],[11435147660766496741,2163528024003768644,12110920487474373676,12639486733043466090,8804763001225416124,15726496377243608372],[11435147660766496741,2163528024003768644,7128559142392931896,12110920487474373676,13323241418027154136,12639486733043466090,1801066723091712434,8804763001225416124,17154757625902243313,4390668436091073484,12122314434656187176,16611856724057842399,10686861494573327243,10806978668166337270,11386926595254122633,6523786079462141312,13676600738025998635,6097807941755042226,5883606306991910210,15385259560644295534,3726756269632080543,17327221498641745184,3683309254695891012,12317719117993811200,17239043462037837834,9069881382900058607,4037968351431607570,2128810469968776913,12416569579970107543,13644002059194136823,17437077810654043142,15002088321732485705],[11435147660766496741,2163528024003768644,12110920487474373676,12639486733043466090,8804763001225416124,15726496377243608372],[4390668436091073484,11386926595254122633,13676600738025998635,2128810469968776913],[11435147660766496741,2163528024003768644,12110920487474373676,12639486733043466090,8804763001225416124,15726496377243608372],[15726496377243608372],[11435147660766496741,2163528024003768644,12110920487474373676,12639486733043466090,8804763001225416124,15726496377243608372],[4390668436091073484,12122314434656187176,16611856724057842399,10686861494573327243,10806978668166337270,11386926595254122633,6523786079462141312,13676600738025998635,6097807941755042226,5883606306991910210,15385259560644295534,3726756269632080543,17327221498641745184,3683309254695891012,12317719117993811200,17239043462037837834,9069881382900058607,4037968351431607570,2128810469968776913,12416569579970107543,13644002059194136823,17437077810654043142,15002088321732485705],[11435147660766496741,2163528024003768644,12110920487474373676,12639486733043466090,8804763001225416124,15726496377243608372],[13132104524813958174],[11435147660766496741],[2163528024003768644],[12110920487474373676],[12639486733043466090],[8804763001225416124],[11435147660766496741],[15726496377243608372],[3934928477288442109],[239716716021064150],[15726496377243608372],[15726496377243608372,11435147660766496741],[239716716021064150],[239716716021064150,7711570794020903773],[239716716021064150,3934928477288442109],[4390668436091073484],[12122314434656187176],[10686861494573327243],[11386926595254122633],[4390668436091073484],[13676600738025998635,2128810469968776913],[13676600738025998635,6097807941755042226,5883606306991910210,15385259560644295534,3726756269632080543,17327221498641745184,3683309254695891012,12317719117993811200,17239043462037837834,9069881382900058607,4037968351431607570,2128810469968776913,12416569579970107543,13644002059194136823,17437077810654043142,15002088321732485705],[11386926595254122633],[13676600738025998635],[6097807941755042226],[15385259560644295534],[17327221498641745184],[12317719117993811200],[9069881382900058607],[2128810469968776913],[13132104524813958174],[2128810469968776913],[13132104524813958174],[2163528024003768644],[239716716021064150],[3934928477288442109],[8804763001225416124],[12639486733043466090],[12110920487474373676],[2163528024003768644],[4390668436091073484],[13676600738025998635],[2128810469968776913],[2163528024003768644],[9069881382900058607],[12317719117993811200,9069881382900058607],[17327221498641745184,12317719117993811200,9069881382900058607],[15385259560644295534,17327221498641745184,12317719117993811200,9069881382900058607],[12317719117993811200,15385259560644295534,9069881382900058607,17327221498641745184,6097807941755042226],[17327221498641745184,12317719117993811200,11386926595254122633,6097807941755042226,9069881382900058607,15385259560644295534],[9069881382900058607,6097807941755042226,10686861494573327243,15385259560644295534,11386926595254122633,12317719117993811200,17327221498641745184],[10686861494573327243,15385259560644295534,12122314434656187176,11386926595254122633,9069881382900058607,6097807941755042226,12317719117993811200,17327221498641745184],[12122314434656187176,6097807941755042226,11386926595254122633,12317719117993811200,17327221498641745184,10686861494573327243,239716716021064150,15385259560644295534,9069881382900058607],[9069881382900058607,239716716021064150,6097807941755042226,12122314434656187176,12317719117993811200,10686861494573327243,15385259560644295534,17327221498641745184,11386926595254122633,3934928477288442109],[9069881382900058607,13676600738025998635,3934928477288442109,12122314434656187176,6097807941755042226,15385259560644295534,4390668436091073484,10686861494573327243,17327221498641745184,11386926595254122633,12317719117993811200,239716716021064150],[6097807941755042226,3934928477288442109,4390668436091073484,9069881382900058607,13676600738025998635,11386926595254122633,15385259560644295534,12122314434656187176,8804763001225416124,10686861494573327243,239716716021064150,12317719117993811200,17327221498641745184],[9069881382900058607,12122314434656187176,13676600738025998635,10686861494573327243,12317719117993811200,6097807941755042226,15385259560644295534,239716716021064150,17327221498641745184,11386926595254122633,3934928477288442109,8804763001225416124,12639486733043466090,4390668436091073484],[10686861494573327243,15385259560644295534,17327221498641745184,239716716021064150,8804763001225416124,6097807941755042226,11386926595254122633,12317719117993811200,12122314434656187176,9069881382900058607,3934928477288442109,12639486733043466090],[10686861494573327243,17327221498641745184,12317719117993811200,11386926595254122633,12639486733043466090,12122314434656187176,9069881382900058607,6097807941755042226,12110920487474373676,3934928477288442109,15385259560644295534,8804763001225416124,239716716021064150],[12110920487474373676,10686861494573327243,11386926595254122633,12317719117993811200,8804763001225416124,3934928477288442109,9069881382900058607,15385259560644295534,2163528024003768644,17327221498641745184,239716716021064150,12639486733043466090,12122314434656187176,6097807941755042226],[2128810469968776913],[17327221498641745184],[]],"selection_redo_history":[]}}},"collapsed":[4390668436091073485,13676600738025998636,13132104524813958175],"name":"Parametric Dunescape","commit_hash":"c4e16e1aac642bbcde72f41f86deed79e6e38006","document_ptz":{"pan":[-999.515765085624,-500.18277881031514],"tilt":0.0,"zoom":0.940975,"flip":false},"document_mode":"DesignMode","view_mode":"Normal","overlays_visibility_settings":{"all":true,"artboard_name":true,"compass_rose":true,"quick_measurement":true,"transform_measurement":true,"transform_cage":true,"hover_outline":true,"selection_outline":true,"pivot":true,"path":true,"anchors":true,"handles":true},"rulers_visible":true,"snapping_state":{"snapping_enabled":true,"grid_snapping":false,"artboards":true,"tolerance":8.0,"bounding_box":{"center_point":true,"corner_point":true,"edge_midpoint":true,"align_with_edges":true,"distribute_evenly":true},"path":{"anchor_point":true,"line_midpoint":true,"along_path":true,"normal_to_path":true,"tangent_to_path":true,"path_intersection_point":true,"align_with_anchor_point":true,"perpendicular_from_endpoint":true},"grid":{"origin":[0.0,0.0],"grid_type":{"Rectangular":{"spacing":[1.0,1.0]}},"rectangular_spacing":[1.0,1.0],"isometric_y_spacing":1.0,"isometric_angle_a":30.0,"isometric_angle_b":30.0,"grid_color":{"red":0.6038274,"green":0.6038274,"blue":0.6038274,"alpha":1.0},"dot_display":false}},"graph_view_overlay_open":false,"graph_fade_artwork_percentage":80.0} \ No newline at end of file diff --git a/demo-artwork/procedural-string-lights.graphite b/demo-artwork/procedural-string-lights.graphite index dd9d49b8a5..8fea833978 100644 --- a/demo-artwork/procedural-string-lights.graphite +++ b/demo-artwork/procedural-string-lights.graphite @@ -1 +1 @@ -{"network_interface":{"network":{"exports":[{"Node":{"node_id":14972365039974885000,"output_index":0,"lambda":false}}],"nodes":[[183562335973647870,{"inputs":[{"Node":{"node_id":4248875763694880300,"output_index":0,"lambda":false}},{"Node":{"node_id":2181148486404191200,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[665049002420596400,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34],"remove":[],"delta":[[5,[66.22222222222223,152.88888888888886]],[11,[136.88888888888886,39.111111111111086]],[28,[39.111111111111086,-58.22222222222226]],[25,[0.8888888888888573,-94.66666666666669]],[15,[111.11111111111114,-60.888888888888914]],[29,[-32.888888888888914,-14.666666666666686]],[14,[183.11111111111103,-19.111111111111143]],[20,[128.4444444444444,-142.22222222222223]],[31,[-53.33333333333337,13.777777777777771]],[4,[18.66666666666663,157.77777777777771]],[18,[145.77777777777777,-97.7777777777778]],[2,[-67.55555555555554,158.22222222222217]],[13,[153.77777777777777,-1.3333333333333712]],[32,[9.333333333333314,38.66666666666663]],[6,[123.99999999999994,148.4444444444444]],[34,[-5.333333333333371,99.11111111111109]],[12,[199.5555555555555,10.666666666666629]],[21,[76.0,-202.22222222222223]],[16,[159.5555555555555,-75.55555555555557]],[22,[71.11111111111109,-201.7777777777778]],[10,[216.4444444444444,72.4444444444444]],[24,[57.77777777777777,-129.33333333333334]],[3,[45.77777777777777,145.33333333333331]],[30,[-9.333333333333371,0.0]],[26,[22.66666666666663,-81.33333333333337]],[9,[156.4444444444444,97.33333333333331]],[8,[252.4444444444444,124.88888888888886]],[1,[-103.55555555555554,126.66666666666664]],[7,[229.33333333333331,152.4444444444444]],[19,[90.66666666666664,-129.33333333333334]],[17,[123.99999999999994,-84.00000000000003]],[33,[-78.22222222222223,75.55555555555554]],[23,[19.555555555555543,-139.55555555555557]],[27,[-11.111111111111144,-72.00000000000003]]]},"segments":{"add":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34],"remove":[],"start_point":[[12,12],[27,27],[25,25],[32,32],[8,8],[6,6],[26,26],[9,9],[13,13],[3,3],[2,2],[28,28],[10,10],[29,29],[22,22],[21,21],[30,30],[33,33],[20,20],[5,5],[1,1],[15,15],[31,31],[11,11],[23,23],[7,7],[4,4],[34,34],[17,17],[14,14],[18,18],[16,16],[19,19],[24,24]],"end_point":[[26,27],[16,17],[30,31],[31,32],[33,34],[25,26],[7,8],[19,20],[13,14],[22,23],[24,25],[12,13],[18,19],[29,30],[23,24],[15,16],[10,11],[3,4],[11,12],[4,5],[20,21],[5,6],[14,15],[9,10],[21,22],[6,7],[32,33],[17,18],[8,9],[28,29],[34,1],[27,28],[2,3],[1,2]],"handle_primary":[[11,[0.0,0.0]],[20,[0.0,0.0]],[1,[0.0,0.0]],[32,[0.0,0.0]],[18,[0.0,0.0]],[15,[0.0,0.0]],[10,[0.0,0.0]],[9,[0.0,0.0]],[14,[0.0,0.0]],[31,[0.0,0.0]],[3,[0.0,0.0]],[12,[0.0,0.0]],[5,[0.0,0.0]],[33,[0.0,0.0]],[21,[0.0,0.0]],[17,[0.0,0.0]],[26,[0.0,0.0]],[4,[0.0,0.0]],[23,[0.0,0.0]],[8,[0.0,0.0]],[16,[0.0,0.0]],[22,[0.0,0.0]],[34,[0.0,0.0]],[7,[24.88888888888891,-15.111111111111086]],[28,[0.0,0.0]],[27,[0.0,0.0]],[2,[30.66666666666663,2.6666666666666856]],[19,[0.0,0.0]],[13,[0.0,0.0]],[25,[0.0,0.0]],[30,[0.0,0.0]],[24,[0.0,0.0]],[6,[0.0,0.0]],[29,[0.0,0.0]]],"handle_end":[[27,[-39.55555555555554,12.444444444444429]],[34,[65.7777777777778,12.444444444444445]],[13,[-13.333333333333371,14.222222222222229]],[17,[-10.222222222222172,12.444444444444455]],[31,[-42.22222222222223,5.333333333333314]],[32,[55.111111111111086,9.777777777777771]],[8,[36.0,41.77777777777777]],[19,[-9.777777777777844,23.55555555555557]],[7,[0.0,0.0]],[33,[-64.44444444444446,3.111111111111157]],[16,[6.666666666666629,13.333333333333314]],[10,[26.66666666666663,44.44444444444446]],[23,[-35.55555555555554,11.1111111111111]],[29,[-17.77777777777777,-3.555555555555543]],[1,[-30.666666666666615,-2.6666666666666856]],[11,[-24.0,31.555555555555543]],[26,[26.22222222222223,2.666666666666657]],[15,[-12.444444444444455,28.444444444444457]],[2,[-51.111111111111086,14.666666666666686]],[6,[-24.88888888888891,15.111111111111086]],[5,[-13.333333333333384,14.222222222222229]],[21,[0.0,0.0]],[22,[38.22222222222223,4.888888888888886]],[25,[-11.111111111111144,-1.7777777777778]],[30,[35.111111111111086,1.333333333333373]],[9,[-34.222222222222285,36.0]],[3,[8.4444444444444,-0.8888888888889142]],[12,[18.66666666666663,16.0]],[24,[47.55555555555554,4.888888888888886]],[14,[29.33333333333337,57.77777777777777]],[18,[13.3333333333333,41.33333333333334]],[4,[-31.555555555555543,18.22222222222223]],[28,[54.66666666666663,6.666666666666686]],[20,[13.333333333333371,70.22222222222223]]],"stroke":[[34,0],[23,0],[27,0],[29,0],[4,0],[17,0],[33,0],[16,0],[11,0],[10,0],[8,0],[22,0],[32,0],[24,0],[2,0],[26,0],[13,0],[14,0],[5,0],[12,0],[19,0],[31,0],[9,0],[1,0],[30,0],[21,0],[20,0],[18,0],[7,0],[3,0],[15,0],[6,0],[25,0],[28,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":34}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14972365039974885000,{"inputs":[{"Value":{"tagged_value":{"ArtboardGroup":{"instance":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":3471929742275053000,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"IVec2":[0,0]},"exposed":false}},{"Value":{"tagged_value":{"IVec2":[1000,1000]},"exposed":false}},{"Value":{"tagged_value":{"Color":{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graph_craft::document::value::TaggedValue","alias":null}},"import_index":1}},{"Value":{"tagged_value":{"String":"Artboard"},"exposed":false}},{"Network":{"import_type":{"Concrete":{"name":"graph_craft::document::value::TaggedValue","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"graph_craft::document::value::TaggedValue","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"graph_craft::document::value::TaggedValue","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"graph_craft::document::value::TaggedValue","alias":null}},"import_index":5}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToArtboardNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Network":{"import_type":{"Fn":[{"Concrete":{"name":"core::option::Option>","alias":null}},{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}}]},"import_index":0}},{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::AppendArtboardNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13394621587544123000,{"inputs":[{"Node":{"node_id":13907401402762847509,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.6484375,"green":0.6484375,"blue":0.6484375,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.6484375,"green":0.6484375,"blue":0.6484375,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.91796875,"green":0.68489075,"blue":0.68489075,"alpha":1.0}],[1.0,{"red":0.8862745,"green":0.16470589,"blue":0.16470589,"alpha":1.0}]],"gradient_type":"Radial","start":[0.4915209831246563,0.36613756613756576],"end":[0.49551110871305326,0.9947089947089944],"transform":[250.61867799546343,0.0,0.0,472.4999999999999,809.8156610022683,336.0000000000002]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[11411423299989983000,{"inputs":[{"Node":{"node_id":16877573495957869000,"output_index":0,"lambda":false}},{"Node":{"node_id":3958246774416220000,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2800556534906834400,{"inputs":[{"Node":{"node_id":3958246774416220000,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":105.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14631609508767818000,{"inputs":[{"Node":{"node_id":15889416971203222000,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"DVec2":[487.1243076693745,127.7443401649906]},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[25.393705016577044,25.003032631706716]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.5,0.5]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2908374490615384600,{"inputs":[{"Node":{"node_id":17339085479159577000,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.078431375,"green":0.14901961,"blue":0.20784314,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.078431375,"green":0.14901961,"blue":0.20784314,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[16765094648901306000,{"inputs":[{"Value":{"tagged_value":{"GraphicGroup":{"instance":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":8147814087664910471,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[655907162126315400,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7,8,9,10,11],"remove":[],"delta":[[2,[587.0,291.9999999999999]],[7,[304.0,611.9999999999999]],[9,[750.0,703.9999999999999]],[5,[639.0,438.9999999999999]],[3,[373.0,372.9999999999999]],[8,[475.0,671.9999999999999]],[10,[455.0,824.9999999999999]],[6,[495.0,533.9999999999999]],[1,[416.0,270.9999999999999]],[11,[186.0,824.9999999999999]],[4,[484.0,446.9999999999999]]]},"segments":{"add":[1,2,3,4,5,6,7,8,9,10],"remove":[],"start_point":[[8,8],[2,2],[6,6],[1,1],[10,10],[3,3],[5,5],[9,9],[7,7],[4,4]],"end_point":[[8,9],[3,4],[2,3],[9,10],[4,5],[5,6],[6,7],[10,11],[1,2],[7,8]],"handle_primary":[[6,[0.0,0.0]],[5,[0.0,0.0]],[10,[0.0,0.0]],[8,[0.0,0.0]],[1,[0.0,0.0]],[2,[0.0,0.0]],[3,[0.0,0.0]],[7,[0.0,0.0]],[9,[0.0,0.0]],[4,[0.0,0.0]]],"handle_end":[[5,[0.0,0.0]],[8,[0.0,0.0]],[9,[0.0,0.0]],[3,[0.0,0.0]],[1,[0.0,0.0]],[7,[0.0,0.0]],[4,[0.0,0.0]],[6,[0.0,0.0]],[10,[0.0,0.0]],[2,[0.0,0.0]]],"stroke":[[9,0],[2,0],[1,0],[10,0],[6,0],[4,0],[7,0],[8,0],[3,0],[5,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16877573495957869000,{"inputs":[{"Node":{"node_id":4534782777857480700,"output_index":0,"lambda":false}},{"Node":{"node_id":5737014828407011000,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[5737014828407011000,{"inputs":[{"Node":{"node_id":10504222558938851000,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"DVec2":[499.21344163872624,106.32837674079803]},"exposed":false}},{"Value":{"tagged_value":{"F64":3.141592653589793},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[55.110312549931045,55.110312549931045]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[-1.921525468856923e-16,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.5,0.5]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10504222558938851000,{"inputs":[{"Node":{"node_id":13571989088655643000,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Gradient":{"stops":[[0.0,{"red":1.0,"green":0.94460994,"blue":0.79296875,"alpha":1.0}],[1.0,{"red":0.89411765,"green":0.654902,"blue":0.0,"alpha":1.0}]],"gradient_type":"Radial","start":[0.4703098217208352,0.4995258072961386],"end":[0.9924395932459462,0.5005395053456176],"transform":[237.34320332463173,-71.34811668265112,75.01984946235177,249.55741247555255,995.9008094918244,343.8953521035491]}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":1.0,"green":0.94460994,"blue":0.79296875,"alpha":1.0}],[1.0,{"red":0.89411765,"green":0.654902,"blue":0.0,"alpha":1.0}]],"gradient_type":"Radial","start":[0.4703098217208352,0.4995258072961386],"end":[0.9924395932459462,0.5005395053456176],"transform":[237.34320332463173,-71.34811668265112,75.01984946235177,249.55741247555255,995.9008094918244,343.8953521035491]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[4248875763694880300,{"inputs":[{"Value":{"tagged_value":{"GraphicGroup":{"instance":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":7297408968096180000,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3471929742275053000,{"inputs":[{"Node":{"node_id":11411423299989983000,"output_index":0,"lambda":false}},{"Node":{"node_id":4217566479741824000,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[169695252050218443,{"inputs":[{"Node":{"node_id":6559102076450693000,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Gradient":{"stops":[[0.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":0.75}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":0.01}]],"gradient_type":"Radial","start":[0.4915209831246563,0.36613756613756576],"end":[0.49551110871305326,0.9947089947089944],"transform":[250.61867799546343,0.0,0.0,472.4999999999999,809.8156610022683,336.0000000000002]}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":0.7734375}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":0.01}]],"gradient_type":"Radial","start":[0.4915209831246563,0.36613756613756576],"end":[0.49551110871305326,0.9947089947089944],"transform":[250.61867799546343,0.0,0.0,472.4999999999999,809.8156610022683,336.0000000000002]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[5250960114142560178,{"inputs":[{"Node":{"node_id":655907162126315400,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.18629456,"green":0.18054199,"blue":0.2265625,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"F64":8.0},"exposed":false}},{"Value":{"tagged_value":{"VecF64":[]},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"LineCap":"Round"},"exposed":false}},{"Value":{"tagged_value":{"LineJoin":"Miter"},"exposed":false}},{"Value":{"tagged_value":{"F64":4.0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::StrokeNode"}},"visible":true,"skip_deduplication":false}],[17339085479159577000,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7],"remove":[],"delta":[[1,[88.4444444444444,151.55555555555554]],[4,[28.296296296296305,198.96296296296293]],[7,[66.51851851851853,147.1111111111111]],[5,[28.296296296296305,197.33333333333331]],[2,[122.22222222222224,196.4444444444444]],[3,[123.55555555555554,199.1111111111111]],[6,[58.962962962962976,152.74074074074073]]]},"segments":{"add":[1,2,3,4,5,6,7],"remove":[],"start_point":[[2,2],[5,5],[3,3],[6,6],[4,4],[1,1],[7,7]],"end_point":[[1,2],[2,3],[4,5],[5,6],[7,1],[6,7],[3,4]],"handle_primary":[[4,[0.0,0.0]],[3,[0.0,0.0]],[1,[0.0,0.0]],[2,[0.0,0.0]],[5,[0.0,0.0]],[6,[0.0,0.0]],[7,[0.0,0.0]]],"handle_end":[[3,[0.0,0.0]],[4,[0.0,0.0]],[1,[-32.0,-3.5555555555555145]],[7,[0.0,0.0]],[2,[0.0,0.0]],[6,[0.0,0.0]],[5,[5.92592592592591,45.77777777777786]]],"stroke":[[4,0],[3,0],[7,0],[5,0],[2,0],[6,0],[1,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":7}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13571989088655643000,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"U32":5},"exposed":false}},{"Value":{"tagged_value":{"F64":0.5},"exposed":false}},{"Value":{"tagged_value":{"F64":1.0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::generator_nodes::StarNode"}},"visible":true,"skip_deduplication":false}],[8147814087664910471,{"inputs":[{"Node":{"node_id":2866788868013687300,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.3372549,"green":0.33333334,"blue":0.40784314,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.3372549,"green":0.33333334,"blue":0.40784314,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[13907401402762847509,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[10666000720855117911,12291367210538906710,11079673538758176715,9852417284720842144,13528392218319754720],"position":[[0.0,16.600000381469727],[13.314000129699709,30.4060001373291],[0.0,66.8030014038086],[-13.314000129699709,30.4060001373291],[0.0,16.600000381469727]]},"segment_domain":{"id":[1,2,3,4,5],"start_point":[0,1,2,3,4],"end_point":[1,2,3,4,0],"handles":[{"Cubic":{"handle_start":[7.347000122070312,16.600000381469727],"handle_end":[13.314000129699709,22.788000106811523]}},{"Cubic":{"handle_start":[13.314000129699709,38.02399826049805],"handle_end":[4.480999946594238,66.8030014038086]}},{"Cubic":{"handle_start":[-4.480999946594238,66.8030014038086],"handle_end":[-13.314000129699709,38.02299880981445]}},{"Cubic":{"handle_start":[-13.314000129699709,22.788000106811523],"handle_end":[-7.347000122070312,16.600000381469727]}},{"Cubic":{"handle_start":[0.0,16.600000381469727],"handle_end":[0.0,16.600000381469727]}}],"stroke":[0,0,0,0,0]},"region_domain":{"id":[0],"segment_range":[{"start":1,"end":5}],"fill":[0]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":false}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[],"remove":[13528392218319754720],"delta":[]},"segments":{"add":[4],"remove":[5],"start_point":[[4,9852417284720842144]],"end_point":[[4,10666000720855117911]],"handle_primary":[[4,[0.0,-7.618000030517578]]],"handle_end":[[4,[-7.34700012207,-3.552713678800501e-15]]],"stroke":[[4,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[[{"ty":"End","segment":4},{"ty":"Primary","segment":1}],[{"ty":"End","segment":4},{"ty":"Primary","segment":5}]]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[6559102076450693000,{"inputs":[{"Node":{"node_id":13907401402762847509,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}],[2866788868013687300,{"inputs":[{"Node":{"node_id":8496292024993914696,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}],[4331062027851128000,{"inputs":[{"Node":{"node_id":665049002420596400,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Gradient":{"stops":[[0.0,{"red":0.1764706,"green":0.25882354,"blue":0.32156864,"alpha":1.0}],[1.0,{"red":0.16577148,"green":0.37890625,"blue":0.36788198,"alpha":1.0}]],"gradient_type":"Linear","start":[0.3769992978075994,0.1888891278143931],"end":[0.9861902161192166,0.9200728483862376],"transform":[801.0625,0.0,0.0,820.5871973335948,698.0,185.0]}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.1764706,"green":0.25882354,"blue":0.32156864,"alpha":1.0}],[1.0,{"red":0.16577148,"green":0.37890625,"blue":0.36788198,"alpha":1.0}]],"gradient_type":"Linear","start":[0.3769992978075994,0.1888891278143931],"end":[0.9861902161192166,0.9200728483862376],"transform":[801.0625,0.0,0.0,820.5871973335948,698.0,185.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[11815560782623298000,{"inputs":[{"Node":{"node_id":16765094648901306000,"output_index":0,"lambda":false}},{"Node":{"node_id":13394621587544123000,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13371003476981866000,{"inputs":[{"Node":{"node_id":11815560782623298000,"output_index":0,"lambda":false}},{"Node":{"node_id":169695252050218443,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4534782777857480700,{"inputs":[{"Node":{"node_id":183562335973647870,"output_index":0,"lambda":false}},{"Node":{"node_id":14631609508767818000,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[17790961655412892000,{"inputs":[{"Node":{"node_id":2800556534906834400,"output_index":0,"lambda":false}},{"Node":{"node_id":13371003476981866000,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.0},"exposed":false}},{"Value":{"tagged_value":{"F64":1.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":10.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[2181148486404191200,{"inputs":[{"Node":{"node_id":4331062027851128000,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"DVec2":[353.5143520436918,551.6238777493922]},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[1.9777789484064812,1.9777789484064812]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.5,0.5]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4217566479741824000,{"inputs":[{"Node":{"node_id":17790961655412892000,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"GradientStops":[[0.0,{"red":0.16470589,"green":0.8862745,"blue":0.4117647,"alpha":1.0}],[0.5,{"red":0.8862745,"green":0.16470589,"blue":0.16470589,"alpha":1.0}],[1.0,{"red":0.16470589,"green":0.54901963,"blue":0.8862745,"alpha":1.0}]]},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"U32":3},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::AssignColorsNode"}},"visible":true,"skip_deduplication":false}],[3958246774416220000,{"inputs":[{"Node":{"node_id":5250960114142560178,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SplineNode"}},"visible":true,"skip_deduplication":false}],[7297408968096180000,{"inputs":[{"Node":{"node_id":2908374490615384600,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"DVec2":[353.5143520436944,551.6238777493922]},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[1.9777789484064812,1.9777789484064812]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.5,0.5]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[8309013977031955000,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[1,[0.0,0.0]],[3,[1.0,1.0]],[2,[1.0,0.0]],[4,[0.0,1.0]]]},"segments":{"add":[1,2,3,4],"remove":[],"start_point":[[3,3],[2,2],[1,1],[4,4]],"end_point":[[3,4],[4,1],[1,2],[2,3]],"handle_primary":[[2,[0.0,0.0]],[3,[0.0,0.0]],[4,[0.0,0.0]],[1,[0.0,0.0]]],"handle_end":[[3,[0.0,0.0]],[1,[0.0,0.0]],[4,[0.0,0.0]],[2,[0.0,0.0]]],"stroke":[[3,0],[4,0],[2,0],[1,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":4}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[8496292024993914696,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[8579252446942557840,5702904670777106146,6914816536199142761,17771770146045579307,4317718082554655671],"position":[[-5.75,-0.4000000059604645],[5.75,-0.4000000059604645],[10.0,21.600000381469727],[-10.0,21.600000381469727],[-5.75,-0.4000000059604645]]},"segment_domain":{"id":[1,2,3,4,5],"start_point":[0,1,2,3,4],"end_point":[1,2,3,4,0],"handles":[{"Cubic":{"handle_start":[-5.75,-0.4000000059604645],"handle_end":[5.75,-0.4000000059604645]}},{"Cubic":{"handle_start":[5.75,-0.4000000059604645],"handle_end":[10.0,21.600000381469727]}},{"Cubic":{"handle_start":[10.0,21.600000381469727],"handle_end":[-10.0,21.600000381469727]}},{"Cubic":{"handle_start":[-10.0,21.600000381469727],"handle_end":[-5.75,-0.4000000059604645]}},{"Cubic":{"handle_start":[-5.75,-0.4000000059604645],"handle_end":[-5.75,-0.4000000059604645]}}],"stroke":[0,0,0,0,0]},"region_domain":{"id":[0],"segment_range":[{"start":1,"end":5}],"fill":[0]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":false}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[],"remove":[4317718082554655671],"delta":[]},"segments":{"add":[4],"remove":[5],"start_point":[[4,17771770146045579307]],"end_point":[[4,8579252446942557840]],"handle_primary":[[4,[0.0,0.0]]],"handle_end":[[4,[0.0,0.0]]],"stroke":[[4,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15889416971203222000,{"inputs":[{"Node":{"node_id":8309013977031955000,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.89411765,"green":0.654902,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.89411765,"green":0.654902,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]},"network_metadata":{"persistent_metadata":{"node_metadata":[[10504222558938851000,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[5737014828407011000,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"x":"X","y":"Y","unit":" px","input_name":"Translation"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"input_name":"Scale","y":"H","unit":"x","x":"W"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"hidden"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4248875763694880300,{"persistent_metadata":{"reference":"Merge","display_name":"Tree Stump","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4217566479741824000,{"persistent_metadata":{"reference":"Assign Colors","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Group"},"widget_override":"hidden"},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Stroke"},"widget_override":null},{"input_data":{"input_name":"Gradient"},"widget_override":"assign_colors_gradient"},{"input_data":{"input_name":"Reverse"},"widget_override":null},{"input_data":{"input_name":"Randomize"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null},{"input_data":{"input_name":"Repeat Every"},"widget_override":"assign_colors_repeat_every"}],"output_names":["Vector Group"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[655907162126315400,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-50,15]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[3471929742275053000,{"persistent_metadata":{"reference":"Merge","display_name":"Lights","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Absolute":[-8,12]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13394621587544123000,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[15889416971203222000,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[14972365039974885000,{"persistent_metadata":{"reference":"Artboard","display_name":"","input_properties":[{"input_data":{"input_name":"Artboards"},"widget_override":null},{"input_data":{"input_name":"Contents"},"widget_override":"hidden"},{"input_data":{"y":"Y","unit":" px","input_name":"Location","x":"X"},"widget_override":"vec2"},{"input_data":{"x":"W","input_name":"Dimensions","unit":" px","y":"H"},"widget_override":"vec2"},{"input_data":{"input_name":"Background"},"widget_override":"artboard_background"},{"input_data":{"input_name":"Clip"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Absolute":[-4,9]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-2,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Artboard","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-10,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Append Artboards","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[6,-4]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[3958246774416220000,{"persistent_metadata":{"reference":"Spline","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-36,15]}}},"network_metadata":null}}],[8309013977031955000,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13571989088655643000,{"persistent_metadata":{"reference":"Star","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"Sides"},"widget_override":null},{"input_data":{"input_name":"Radius"},"widget_override":null},{"input_data":{"input_name":"Inner Radius"},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[2800556534906834400,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"blank_assist":true,"min":1,"mode":"Increment","is_integer":false,"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","unit":" px","input_name":"Spacing"},"widget_override":"number"},{"input_data":{"input_name":"Start Offset","mode":"Increment","unit":" px","blank_assist":true,"is_integer":false,"min":0,"tooltip":"Exclude some distance from the start of the path before the first instance"},"widget_override":"number"},{"input_data":{"input_name":"Stop Offset","tooltip":"Exclude some distance from the end of the path after the last instance","mode":"Increment","blank_assist":true,"min":0,"unit":" px","is_integer":false},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,5]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16765094648901306000,{"persistent_metadata":{"reference":"Merge","display_name":"Bulb Housing","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[183562335973647870,{"persistent_metadata":{"reference":"Merge","display_name":"Tree","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14631609508767818000,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Translation","unit":" px","x":"X","y":"Y"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"y":"H","x":"W","input_name":"Scale","unit":"x"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"hidden"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[7297408968096180000,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"y":"Y","input_name":"Translation","unit":" px","x":"X"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"unit":"x","x":"W","input_name":"Scale","y":"H"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"hidden"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[5250960114142560178,{"persistent_metadata":{"reference":"Stroke","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Color"},"widget_override":null},{"input_data":{"input_name":"Weight"},"widget_override":null},{"input_data":{"input_name":"Dash Lengths"},"widget_override":null},{"input_data":{"input_name":"Dash Offset"},"widget_override":null},{"input_data":{"input_name":"Line Cap"},"widget_override":null},{"input_data":{"input_name":"Line Join"},"widget_override":null},{"input_data":{"input_name":"Miter Limit"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-43,15]}}},"network_metadata":null}}],[8147814087664910471,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[16877573495957869000,{"persistent_metadata":{"reference":"Merge","display_name":"Star","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":10}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13907401402762847509,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":["Vector Data"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-50,21]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[665049002420596400,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4534782777857480700,{"persistent_metadata":{"reference":"Merge","display_name":"Star Base","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13371003476981866000,{"persistent_metadata":{"reference":"Merge","display_name":"Bulb Glow Gradient","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Absolute":[-29,18]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[8496292024993914696,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":["Vector Data"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2908374490615384600,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[11815560782623298000,{"persistent_metadata":{"reference":"Merge","display_name":"Bulb Shape","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[17339085479159577000,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4331062027851128000,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[2866788868013687300,{"persistent_metadata":{"reference":"To Group","display_name":"","input_properties":[{"input_data":{"input_name":"Element"},"widget_override":null}],"output_names":["Instances"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[11411423299989983000,{"persistent_metadata":{"reference":"Merge","display_name":"Wire (Use Path Tool to Reshape This!)","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[169695252050218443,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[2181148486404191200,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"x":"X","unit":" px","input_name":"Translation","y":"Y"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"x":"W","y":"H","input_name":"Scale","unit":"x"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"hidden"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[6559102076450693000,{"persistent_metadata":{"reference":"To Group","display_name":"","input_properties":[{"input_data":{"input_name":"Element"},"widget_override":null}],"output_names":["Instances"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[17790961655412892000,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"tooltip":"Artwork to be copied and placed at each point","input_name":"Instance"},"widget_override":null},{"input_data":{"is_integer":false,"range_max":2,"range_min":0,"blank_assist":true,"unit":"x","tooltip":"Minimum range of randomized sizes given to each instance","input_name":"Random Scale Min","min":0,"mode":"Range"},"widget_override":"number"},{"input_data":{"min":0,"blank_assist":true,"tooltip":"Minimum range of randomized sizes given to each instance","mode":"Range","input_name":"Random Scale Max","is_integer":false,"range_max":2,"range_min":0,"unit":"x"},"widget_override":"number"},{"input_data":{"mode":"Range","range_min":-50,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","input_name":"Random Scale Bias","is_integer":false,"range_max":50,"blank_assist":true},"widget_override":"number"},{"input_data":{"tooltip":"Seed to determine unique variations on all the randomized instance sizes","input_name":"Random Scale Seed","is_integer":true,"min":0,"blank_assist":true,"mode":"Increment"},"widget_override":"number"},{"input_data":{"input_name":"Random Rotation","min":0,"mode":"Range","tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","unit":"°","blank_assist":true,"is_integer":false,"max":360},"widget_override":"number"},{"input_data":{"min":0,"input_name":"Random Rotation Seed","is_integer":true,"mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance angles","blank_assist":true},"widget_override":"number"}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[527.9166666666665,-576.1833333333332],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,1518.0,4.0],"node_graph_top_right":[1980.796875,0.0]},"selection_undo_history":[[],[2866788868013687300],[],[4352028121261571600],[],[2866788868013687300],[6559102076450693000],[6559102076450693000],[10775791528628074000],[],[6559102076450693000],[],[],[],[],[],[15084833709935380000],[],[16765094648901306000],[16765094648901306000,11815560782623298000],[16765094648901306000,13371003476981866000,11815560782623298000],[6559102076450693000,16765094648901306000,13394621587544123000,11815560782623298000,2866788868013687300,13371003476981866000],[3958246774416220000],[],[],[3958246774416220000],[3958246774416220000,655907162126315400],[],[3958246774416220000],[],[3958246774416220000],[655907162126315400,3958246774416220000],[],[],[3958246774416220000],[655907162126315400,3958246774416220000],[],[14631609508767818000],[],[5737014828407011000],[],[10118219203151733000],[],[],[],[],[],[],[655907162126315400],[],[],[655907162126315400,3958246774416220000],[],[],[16877573495957869000],[11411423299989983000],[16877573495957869000],[3471929742275053000],[11411423299989983000],[11411423299989983000,15209576944107258000],[15209576944107258000,3287844738046380000,11411423299989983000],[15209576944107258000,3287844738046380000,11411423299989983000,3958246774416220000],[3958246774416220000,655907162126315400,15209576944107258000,11411423299989983000,3287844738046380000],[4248875763694880300],[11411423299989983000],[3471929742275053000],[11411423299989983000],[15223368326030279287],[11815560782623298000],[11815560782623298000,16765094648901306000],[11815560782623298000],[13371003476981866000],[16765094648901306000],[15223368326030279287],[13371003476981866000],[13371003476981866000,16765094648901306000,11815560782623298000],[13371003476981866000],[11815560782623298000],[16765094648901306000],[13371003476981866000],[16765094648901306000],[11815560782623298000],[13371003476981866000],[11815560782623298000],[13371003476981866000],[16765094648901306000],[13371003476981866000],[16877573495957869000],[16765094648901306000],[13371003476981866000],[16765094648901306000],[11411423299989983000],[]],"selection_redo_history":[]}}},"collapsed":[],"name":"Procedural String Lights","commit_hash":"95bbc95606ba40ed7441fdf4e1b954d80b72e3dc","document_ptz":{"pan":[-500.157717622685,-499.8045823704831],"tilt":0.0,"zoom":1.0,"flip":false},"document_mode":"DesignMode","view_mode":"Normal","overlays_visibility_settings":{"all":true,"artboard_name":true,"compass_rose":true,"quick_measurement":true,"transform_measurement":true,"transform_cage":true,"hover_outline":true,"selection_outline":true,"pivot":true,"path":true,"anchors":true,"handles":true},"rulers_visible":true,"snapping_state":{"snapping_enabled":true,"grid_snapping":false,"artboards":true,"tolerance":8.0,"bounding_box":{"center_point":true,"corner_point":true,"edge_midpoint":true,"align_with_edges":true,"distribute_evenly":true},"path":{"anchor_point":true,"line_midpoint":true,"along_path":true,"normal_to_path":true,"tangent_to_path":true,"path_intersection_point":true,"align_with_anchor_point":true,"perpendicular_from_endpoint":true},"grid":{"origin":[0.0,0.0],"grid_type":{"Rectangular":{"spacing":[1.0,1.0]}},"grid_color":{"red":0.6038274,"green":0.6038274,"blue":0.6038274,"alpha":1.0},"dot_display":false}},"graph_view_overlay_open":false,"graph_fade_artwork_percentage":80.0} \ No newline at end of file +{"network_interface":{"network":{"exports":[{"Node":{"node_id":14972365039974885000,"output_index":0,"lambda":false}}],"nodes":[[183562335973647870,{"inputs":[{"Node":{"node_id":4248875763694880300,"output_index":0,"lambda":false}},{"Node":{"node_id":2181148486404191200,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[665049002420596400,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34],"remove":[],"delta":[[15,[111.11111111111114,-60.888888888888914]],[21,[76.0,-202.22222222222223]],[9,[156.4444444444444,97.33333333333331]],[11,[136.88888888888886,39.111111111111086]],[22,[71.11111111111109,-201.7777777777778]],[19,[90.66666666666664,-129.33333333333334]],[1,[-103.55555555555554,126.66666666666664]],[25,[0.8888888888888573,-94.66666666666669]],[23,[19.555555555555543,-139.55555555555557]],[18,[145.77777777777777,-97.7777777777778]],[26,[22.66666666666663,-81.33333333333337]],[27,[-11.111111111111144,-72.00000000000003]],[33,[-78.22222222222223,75.55555555555554]],[28,[39.111111111111086,-58.22222222222226]],[8,[252.4444444444444,124.88888888888886]],[4,[18.66666666666663,157.77777777777771]],[3,[45.77777777777777,145.33333333333331]],[5,[66.22222222222223,152.88888888888886]],[10,[216.4444444444444,72.4444444444444]],[14,[183.11111111111103,-19.111111111111143]],[34,[-5.333333333333371,99.11111111111109]],[24,[57.77777777777777,-129.33333333333334]],[6,[123.99999999999994,148.4444444444444]],[20,[128.4444444444444,-142.22222222222223]],[7,[229.33333333333331,152.4444444444444]],[13,[153.77777777777777,-1.3333333333333712]],[17,[123.99999999999994,-84.00000000000003]],[2,[-67.55555555555554,158.22222222222217]],[16,[159.5555555555555,-75.55555555555557]],[29,[-32.888888888888914,-14.666666666666686]],[30,[-9.333333333333371,0.0]],[31,[-53.33333333333337,13.777777777777771]],[32,[9.333333333333314,38.66666666666663]],[12,[199.5555555555555,10.666666666666629]]]},"segments":{"add":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34],"remove":[],"start_point":[[23,23],[24,24],[34,34],[9,9],[27,27],[19,19],[33,33],[6,6],[5,5],[18,18],[31,31],[30,30],[12,12],[3,3],[25,25],[1,1],[14,14],[8,8],[2,2],[29,29],[21,21],[10,10],[11,11],[17,17],[7,7],[16,16],[15,15],[20,20],[32,32],[13,13],[22,22],[26,26],[28,28],[4,4]],"end_point":[[27,28],[21,22],[14,15],[28,29],[18,19],[23,24],[31,32],[20,21],[13,14],[29,30],[30,31],[17,18],[11,12],[12,13],[25,26],[9,10],[6,7],[1,2],[26,27],[7,8],[2,3],[34,1],[5,6],[32,33],[10,11],[19,20],[22,23],[24,25],[16,17],[33,34],[3,4],[8,9],[15,16],[4,5]],"handle_primary":[[27,[0.0,0.0]],[6,[0.0,0.0]],[33,[0.0,0.0]],[28,[0.0,0.0]],[21,[0.0,0.0]],[1,[0.0,0.0]],[30,[0.0,0.0]],[24,[0.0,0.0]],[15,[0.0,0.0]],[9,[0.0,0.0]],[22,[0.0,0.0]],[19,[0.0,0.0]],[18,[0.0,0.0]],[25,[0.0,0.0]],[14,[0.0,0.0]],[2,[30.66666666666663,2.6666666666666856]],[29,[0.0,0.0]],[10,[0.0,0.0]],[26,[0.0,0.0]],[16,[0.0,0.0]],[11,[0.0,0.0]],[12,[0.0,0.0]],[34,[0.0,0.0]],[17,[0.0,0.0]],[4,[0.0,0.0]],[7,[24.88888888888891,-15.111111111111086]],[20,[0.0,0.0]],[3,[0.0,0.0]],[31,[0.0,0.0]],[13,[0.0,0.0]],[23,[0.0,0.0]],[8,[0.0,0.0]],[32,[0.0,0.0]],[5,[0.0,0.0]]],"handle_end":[[14,[29.33333333333337,57.77777777777777]],[33,[-64.44444444444446,3.111111111111157]],[23,[-35.55555555555554,11.1111111111111]],[4,[-31.555555555555543,18.22222222222223]],[13,[-13.333333333333371,14.222222222222229]],[19,[-9.777777777777844,23.55555555555557]],[30,[35.111111111111086,1.333333333333373]],[3,[8.4444444444444,-0.8888888888889142]],[31,[-42.22222222222223,5.333333333333314]],[17,[-10.222222222222172,12.444444444444455]],[25,[-11.111111111111144,-1.7777777777778]],[26,[26.22222222222223,2.666666666666657]],[18,[13.3333333333333,41.33333333333334]],[32,[55.111111111111086,9.777777777777771]],[27,[-39.55555555555554,12.444444444444429]],[5,[-13.333333333333384,14.222222222222229]],[11,[-24.0,31.555555555555543]],[20,[13.333333333333371,70.22222222222223]],[21,[0.0,0.0]],[6,[-24.88888888888891,15.111111111111086]],[16,[6.666666666666629,13.333333333333314]],[29,[-17.77777777777777,-3.555555555555543]],[10,[26.66666666666663,44.44444444444446]],[2,[-51.111111111111086,14.666666666666686]],[22,[38.22222222222223,4.888888888888886]],[8,[36.0,41.77777777777777]],[9,[-34.222222222222285,36.0]],[7,[0.0,0.0]],[1,[-30.666666666666615,-2.6666666666666856]],[28,[54.66666666666663,6.666666666666686]],[15,[-12.444444444444455,28.444444444444457]],[24,[47.55555555555554,4.888888888888886]],[12,[18.66666666666663,16.0]],[34,[65.7777777777778,12.444444444444445]]],"stroke":[[29,0],[19,0],[9,0],[15,0],[6,0],[28,0],[12,0],[13,0],[17,0],[14,0],[11,0],[5,0],[26,0],[21,0],[4,0],[16,0],[33,0],[24,0],[1,0],[25,0],[3,0],[27,0],[22,0],[8,0],[18,0],[7,0],[34,0],[20,0],[23,0],[10,0],[32,0],[30,0],[31,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":34}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14972365039974885000,{"inputs":[{"Value":{"tagged_value":{"ArtboardGroup":{"instance":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":3471929742275053000,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"IVec2":[0,0]},"exposed":false}},{"Value":{"tagged_value":{"IVec2":[1000,1000]},"exposed":false}},{"Value":{"tagged_value":{"Color":{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graph_craft::document::value::TaggedValue","alias":null}},"import_index":1}},{"Value":{"tagged_value":{"String":"Artboard"},"exposed":false}},{"Network":{"import_type":{"Concrete":{"name":"graph_craft::document::value::TaggedValue","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"graph_craft::document::value::TaggedValue","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"graph_craft::document::value::TaggedValue","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"graph_craft::document::value::TaggedValue","alias":null}},"import_index":5}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToArtboardNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Network":{"import_type":{"Fn":[{"Concrete":{"name":"core::option::Option>","alias":null}},{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}}]},"import_index":0}},{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::AppendArtboardNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13394621587544123000,{"inputs":[{"Node":{"node_id":13907401402762847509,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.6484375,"green":0.6484375,"blue":0.6484375,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.6484375,"green":0.6484375,"blue":0.6484375,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.91796875,"green":0.68489075,"blue":0.68489075,"alpha":1.0}],[1.0,{"red":0.8862745,"green":0.16470589,"blue":0.16470589,"alpha":1.0}]],"gradient_type":"Radial","start":[0.4915209831246563,0.36613756613756576],"end":[0.49551110871305326,0.9947089947089944],"transform":[250.61867799546343,0.0,0.0,472.4999999999999,809.8156610022683,336.0000000000002]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[11411423299989983000,{"inputs":[{"Node":{"node_id":16877573495957869000,"output_index":0,"lambda":false}},{"Node":{"node_id":3958246774416220000,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14631609508767818000,{"inputs":[{"Node":{"node_id":15889416971203222000,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"DVec2":[487.1243076693745,127.7443401649906]},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[25.393705016577044,25.003032631706716]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.5,0.5]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2908374490615384600,{"inputs":[{"Node":{"node_id":17339085479159577000,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.078431375,"green":0.14901961,"blue":0.20784314,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.078431375,"green":0.14901961,"blue":0.20784314,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[16765094648901306000,{"inputs":[{"Value":{"tagged_value":{"GraphicGroup":{"instance":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":8147814087664910471,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[655907162126315400,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7,8,9,10,11],"remove":[],"delta":[[11,[186.0,824.9999999999999]],[3,[373.0,372.9999999999999]],[6,[495.0,533.9999999999999]],[7,[304.0,611.9999999999999]],[9,[750.0,703.9999999999999]],[1,[416.0,270.9999999999999]],[8,[475.0,671.9999999999999]],[4,[484.0,446.9999999999999]],[2,[587.0,291.9999999999999]],[10,[455.0,824.9999999999999]],[5,[639.0,438.9999999999999]]]},"segments":{"add":[1,2,3,4,5,6,7,8,9,10],"remove":[],"start_point":[[2,2],[6,6],[10,10],[9,9],[3,3],[7,7],[4,4],[1,1],[5,5],[8,8]],"end_point":[[2,3],[10,11],[5,6],[4,5],[6,7],[8,9],[1,2],[9,10],[7,8],[3,4]],"handle_primary":[[5,[0.0,0.0]],[8,[0.0,0.0]],[4,[0.0,0.0]],[7,[0.0,0.0]],[2,[0.0,0.0]],[3,[0.0,0.0]],[6,[0.0,0.0]],[10,[0.0,0.0]],[9,[0.0,0.0]],[1,[0.0,0.0]]],"handle_end":[[3,[0.0,0.0]],[1,[0.0,0.0]],[8,[0.0,0.0]],[9,[0.0,0.0]],[5,[0.0,0.0]],[7,[0.0,0.0]],[2,[0.0,0.0]],[10,[0.0,0.0]],[6,[0.0,0.0]],[4,[0.0,0.0]]],"stroke":[[9,0],[1,0],[5,0],[10,0],[3,0],[4,0],[8,0],[2,0],[6,0],[7,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16877573495957869000,{"inputs":[{"Node":{"node_id":4534782777857480700,"output_index":0,"lambda":false}},{"Node":{"node_id":5737014828407011000,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[5737014828407011000,{"inputs":[{"Node":{"node_id":10504222558938851000,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"DVec2":[499.21344163872624,106.32837674079803]},"exposed":false}},{"Value":{"tagged_value":{"F64":3.141592653589793},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[55.110312549931045,55.110312549931045]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[-1.921525468856923e-16,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.5,0.5]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10504222558938851000,{"inputs":[{"Node":{"node_id":13571989088655643000,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Gradient":{"stops":[[0.0,{"red":1.0,"green":0.94460994,"blue":0.79296875,"alpha":1.0}],[1.0,{"red":0.89411765,"green":0.654902,"blue":0.0,"alpha":1.0}]],"gradient_type":"Radial","start":[0.4703098217208352,0.4995258072961386],"end":[0.9924395932459462,0.5005395053456176],"transform":[237.34320332463173,-71.34811668265112,75.01984946235177,249.55741247555255,995.9008094918244,343.8953521035491]}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":1.0,"green":0.94460994,"blue":0.79296875,"alpha":1.0}],[1.0,{"red":0.89411765,"green":0.654902,"blue":0.0,"alpha":1.0}]],"gradient_type":"Radial","start":[0.4703098217208352,0.4995258072961386],"end":[0.9924395932459462,0.5005395053456176],"transform":[237.34320332463173,-71.34811668265112,75.01984946235177,249.55741247555255,995.9008094918244,343.8953521035491]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[4248875763694880300,{"inputs":[{"Value":{"tagged_value":{"GraphicGroup":{"instance":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":7297408968096180000,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3471929742275053000,{"inputs":[{"Node":{"node_id":11411423299989983000,"output_index":0,"lambda":false}},{"Node":{"node_id":4217566479741824000,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[169695252050218443,{"inputs":[{"Node":{"node_id":6559102076450693000,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Gradient":{"stops":[[0.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":0.75}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":0.01}]],"gradient_type":"Radial","start":[0.4915209831246563,0.36613756613756576],"end":[0.49551110871305326,0.9947089947089944],"transform":[250.61867799546343,0.0,0.0,472.4999999999999,809.8156610022683,336.0000000000002]}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":0.7734375}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":0.01}]],"gradient_type":"Radial","start":[0.4915209831246563,0.36613756613756576],"end":[0.49551110871305326,0.9947089947089944],"transform":[250.61867799546343,0.0,0.0,472.4999999999999,809.8156610022683,336.0000000000002]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[5250960114142560178,{"inputs":[{"Node":{"node_id":655907162126315400,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.18629456,"green":0.18054199,"blue":0.2265625,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"F64":8.0},"exposed":false}},{"Value":{"tagged_value":{"StrokeAlign":"Center"},"exposed":false}},{"Value":{"tagged_value":{"StrokeCap":"Round"},"exposed":false}},{"Value":{"tagged_value":{"StrokeJoin":"Miter"},"exposed":false}},{"Value":{"tagged_value":{"F64":4.0},"exposed":false}},{"Value":{"tagged_value":{"PaintOrder":"StrokeAbove"},"exposed":false}},{"Value":{"tagged_value":{"VecF64":[]},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::StrokeNode"}},"visible":true,"skip_deduplication":false}],[17339085479159577000,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7],"remove":[],"delta":[[5,[28.296296296296305,197.33333333333331]],[3,[123.55555555555554,199.1111111111111]],[7,[66.51851851851853,147.1111111111111]],[1,[88.4444444444444,151.55555555555554]],[4,[28.296296296296305,198.96296296296293]],[2,[122.22222222222224,196.4444444444444]],[6,[58.962962962962976,152.74074074074073]]]},"segments":{"add":[1,2,3,4,5,6,7],"remove":[],"start_point":[[2,2],[5,5],[7,7],[3,3],[6,6],[4,4],[1,1]],"end_point":[[6,7],[3,4],[5,6],[2,3],[1,2],[4,5],[7,1]],"handle_primary":[[2,[0.0,0.0]],[3,[0.0,0.0]],[6,[0.0,0.0]],[4,[0.0,0.0]],[5,[0.0,0.0]],[7,[0.0,0.0]],[1,[0.0,0.0]]],"handle_end":[[2,[0.0,0.0]],[6,[0.0,0.0]],[3,[0.0,0.0]],[4,[0.0,0.0]],[5,[5.92592592592591,45.77777777777786]],[1,[-32.0,-3.5555555555555145]],[7,[0.0,0.0]]],"stroke":[[6,0],[1,0],[7,0],[3,0],[4,0],[2,0],[5,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":7}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13571989088655643000,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"U32":5},"exposed":false}},{"Value":{"tagged_value":{"F64":0.5},"exposed":false}},{"Value":{"tagged_value":{"F64":1.0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::generator_nodes::StarNode"}},"visible":true,"skip_deduplication":false}],[8147814087664910471,{"inputs":[{"Node":{"node_id":2866788868013687300,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.3372549,"green":0.33333334,"blue":0.40784314,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.3372549,"green":0.33333334,"blue":0.40784314,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[13907401402762847509,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[10666000720855117911,12291367210538906710,11079673538758176715,9852417284720842144,13528392218319754720],"position":[[0.0,16.600000381469727],[13.314000129699709,30.4060001373291],[0.0,66.8030014038086],[-13.314000129699709,30.4060001373291],[0.0,16.600000381469727]]},"segment_domain":{"id":[1,2,3,4,5],"start_point":[0,1,2,3,4],"end_point":[1,2,3,4,0],"handles":[{"Cubic":{"handle_start":[7.347000122070312,16.600000381469727],"handle_end":[13.314000129699709,22.788000106811523]}},{"Cubic":{"handle_start":[13.314000129699709,38.02399826049805],"handle_end":[4.480999946594238,66.8030014038086]}},{"Cubic":{"handle_start":[-4.480999946594238,66.8030014038086],"handle_end":[-13.314000129699709,38.02299880981445]}},{"Cubic":{"handle_start":[-13.314000129699709,22.788000106811523],"handle_end":[-7.347000122070312,16.600000381469727]}},{"Cubic":{"handle_start":[0.0,16.600000381469727],"handle_end":[0.0,16.600000381469727]}}],"stroke":[0,0,0,0,0]},"region_domain":{"id":[0],"segment_range":[{"start":1,"end":5}],"fill":[0]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":false}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[],"remove":[13528392218319754720],"delta":[]},"segments":{"add":[4],"remove":[5],"start_point":[[4,9852417284720842144]],"end_point":[[4,10666000720855117911]],"handle_primary":[[4,[0.0,-7.618000030517578]]],"handle_end":[[4,[-7.34700012207,-3.552713678800501e-15]]],"stroke":[[4,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[[{"ty":"End","segment":4},{"ty":"Primary","segment":1}],[{"ty":"End","segment":4},{"ty":"Primary","segment":5}]]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[6559102076450693000,{"inputs":[{"Node":{"node_id":13907401402762847509,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}],[2866788868013687300,{"inputs":[{"Node":{"node_id":8496292024993914696,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}],[4331062027851128000,{"inputs":[{"Node":{"node_id":665049002420596400,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Gradient":{"stops":[[0.0,{"red":0.1764706,"green":0.25882354,"blue":0.32156864,"alpha":1.0}],[1.0,{"red":0.16577148,"green":0.37890625,"blue":0.36788198,"alpha":1.0}]],"gradient_type":"Linear","start":[0.3769992978075994,0.1888891278143931],"end":[0.9861902161192166,0.9200728483862376],"transform":[801.0625,0.0,0.0,820.5871973335948,698.0,185.0]}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.1764706,"green":0.25882354,"blue":0.32156864,"alpha":1.0}],[1.0,{"red":0.16577148,"green":0.37890625,"blue":0.36788198,"alpha":1.0}]],"gradient_type":"Linear","start":[0.3769992978075994,0.1888891278143931],"end":[0.9861902161192166,0.9200728483862376],"transform":[801.0625,0.0,0.0,820.5871973335948,698.0,185.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[11815560782623298000,{"inputs":[{"Node":{"node_id":16765094648901306000,"output_index":0,"lambda":false}},{"Node":{"node_id":13394621587544123000,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13371003476981866000,{"inputs":[{"Node":{"node_id":11815560782623298000,"output_index":0,"lambda":false}},{"Node":{"node_id":169695252050218443,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4534782777857480700,{"inputs":[{"Node":{"node_id":183562335973647870,"output_index":0,"lambda":false}},{"Node":{"node_id":14631609508767818000,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[17790961655412892000,{"inputs":[{"Node":{"node_id":12728151724950013388,"output_index":0,"lambda":false}},{"Node":{"node_id":13371003476981866000,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.0},"exposed":false}},{"Value":{"tagged_value":{"F64":1.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":10.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[2181148486404191200,{"inputs":[{"Node":{"node_id":4331062027851128000,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"DVec2":[353.5143520436918,551.6238777493922]},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[1.9777789484064812,1.9777789484064812]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.5,0.5]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4217566479741824000,{"inputs":[{"Node":{"node_id":17790961655412892000,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"GradientStops":[[0.0,{"red":0.16470589,"green":0.8862745,"blue":0.4117647,"alpha":1.0}],[0.5,{"red":0.8862745,"green":0.16470589,"blue":0.16470589,"alpha":1.0}],[1.0,{"red":0.16470589,"green":0.54901963,"blue":0.8862745,"alpha":1.0}]]},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"U32":3},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::AssignColorsNode"}},"visible":true,"skip_deduplication":false}],[3958246774416220000,{"inputs":[{"Node":{"node_id":5250960114142560178,"output_index":0,"lambda":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SplineNode"}},"visible":true,"skip_deduplication":false}],[7297408968096180000,{"inputs":[{"Node":{"node_id":2908374490615384600,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"DVec2":[353.5143520436944,551.6238777493922]},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[1.9777789484064812,1.9777789484064812]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.5,0.5]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[8309013977031955000,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[3,[1.0,1.0]],[1,[0.0,0.0]],[2,[1.0,0.0]],[4,[0.0,1.0]]]},"segments":{"add":[1,2,3,4],"remove":[],"start_point":[[4,4],[2,2],[1,1],[3,3]],"end_point":[[4,1],[3,4],[1,2],[2,3]],"handle_primary":[[3,[0.0,0.0]],[1,[0.0,0.0]],[2,[0.0,0.0]],[4,[0.0,0.0]]],"handle_end":[[3,[0.0,0.0]],[4,[0.0,0.0]],[1,[0.0,0.0]],[2,[0.0,0.0]]],"stroke":[[1,0],[3,0],[4,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":4}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[8496292024993914696,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[8579252446942557840,5702904670777106146,6914816536199142761,17771770146045579307,4317718082554655671],"position":[[-5.75,-0.4000000059604645],[5.75,-0.4000000059604645],[10.0,21.600000381469727],[-10.0,21.600000381469727],[-5.75,-0.4000000059604645]]},"segment_domain":{"id":[1,2,3,4,5],"start_point":[0,1,2,3,4],"end_point":[1,2,3,4,0],"handles":[{"Cubic":{"handle_start":[-5.75,-0.4000000059604645],"handle_end":[5.75,-0.4000000059604645]}},{"Cubic":{"handle_start":[5.75,-0.4000000059604645],"handle_end":[10.0,21.600000381469727]}},{"Cubic":{"handle_start":[10.0,21.600000381469727],"handle_end":[-10.0,21.600000381469727]}},{"Cubic":{"handle_start":[-10.0,21.600000381469727],"handle_end":[-5.75,-0.4000000059604645]}},{"Cubic":{"handle_start":[-5.75,-0.4000000059604645],"handle_end":[-5.75,-0.4000000059604645]}}],"stroke":[0,0,0,0,0]},"region_domain":{"id":[0],"segment_range":[{"start":1,"end":5}],"fill":[0]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":false}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[],"remove":[4317718082554655671],"delta":[]},"segments":{"add":[4],"remove":[5],"start_point":[[4,17771770146045579307]],"end_point":[[4,8579252446942557840]],"handle_primary":[[4,[0.0,0.0]]],"handle_end":[[4,[0.0,0.0]]],"stroke":[[4,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15889416971203222000,{"inputs":[{"Node":{"node_id":8309013977031955000,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.89411765,"green":0.654902,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.89411765,"green":0.654902,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[12728151724950013388,{"inputs":[{"Node":{"node_id":3958246774416220000,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":105.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]},"network_metadata":{"persistent_metadata":{"node_metadata":[[7297408968096180000,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"x":"X","input_name":"Translation","unit":" px","y":"Y"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"y":"H","unit":"x","x":"W","input_name":"Scale"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"hidden"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[8147814087664910471,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[12728151724950013388,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"mode":"Increment","blank_assist":true,"unit":" px","min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{"min":2.0,"mode":"Increment","is_integer":true,"blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"mode":"Increment","min":0.0,"unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":false,"unit":" px","blank_assist":true,"min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[665049002420596400,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[17339085479159577000,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11411423299989983000,{"persistent_metadata":{"reference":"Merge","display_name":"Wire (Use Path Tool to Reshape This!)","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[5737014828407011000,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"x":"X","input_name":"Translation","unit":" px","y":"Y"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"y":"H","input_name":"Scale","unit":"x","x":"W"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"hidden"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4248875763694880300,{"persistent_metadata":{"reference":"Merge","display_name":"Tree Stump","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4217566479741824000,{"persistent_metadata":{"reference":"Assign Colors","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Group"},"widget_override":"hidden"},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Stroke"},"widget_override":null},{"input_data":{"input_name":"Gradient"},"widget_override":"assign_colors_gradient"},{"input_data":{"input_name":"Reverse"},"widget_override":null},{"input_data":{"input_name":"Randomize"},"widget_override":null},{"input_data":{"input_name":"Seed"},"widget_override":null},{"input_data":{"input_name":"Repeat Every"},"widget_override":"assign_colors_repeat_every"}],"output_names":["Vector Group"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[8309013977031955000,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13571989088655643000,{"persistent_metadata":{"reference":"Star","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"Sides"},"widget_override":null},{"input_data":{"input_name":"Radius"},"widget_override":null},{"input_data":{"input_name":"Inner Radius"},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[5250960114142560178,{"persistent_metadata":{"reference":"Stroke","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Color"},"widget_override":null},{"input_data":{"input_name":"Weight"},"widget_override":null},{"input_data":{"input_name":"Dash Lengths"},"widget_override":null},{"input_data":{"input_name":"Dash Offset"},"widget_override":null},{"input_data":{"input_name":"Line Cap"},"widget_override":null},{"input_data":{"input_name":"Line Join"},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"input_name":"Miter Limit"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-43,15]}}},"network_metadata":null}}],[169695252050218443,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[10504222558938851000,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[14972365039974885000,{"persistent_metadata":{"reference":"Artboard","display_name":"","input_properties":[{"input_data":{"input_name":"Artboards"},"widget_override":null},{"input_data":{"input_name":"Contents"},"widget_override":"hidden"},{"input_data":{"unit":" px","y":"Y","input_name":"Location","x":"X"},"widget_override":"vec2"},{"input_data":{"y":"H","unit":" px","input_name":"Dimensions","x":"W"},"widget_override":"vec2"},{"input_data":{"input_name":"Background"},"widget_override":"artboard_background"},{"input_data":{"input_name":"Clip"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Absolute":[-4,9]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Append Artboards","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[6,-4]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Artboard","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-10,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-2,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4331062027851128000,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[183562335973647870,{"persistent_metadata":{"reference":"Merge","display_name":"Tree","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11815560782623298000,{"persistent_metadata":{"reference":"Merge","display_name":"Bulb Shape","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[3471929742275053000,{"persistent_metadata":{"reference":"Merge","display_name":"Lights","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Absolute":[-8,12]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14631609508767818000,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"x":"X","y":"Y","input_name":"Translation","unit":" px"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"input_name":"Scale","unit":"x","x":"W","y":"H"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"hidden"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2181148486404191200,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"unit":" px","y":"Y","input_name":"Translation","x":"X"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"unit":"x","x":"W","y":"H","input_name":"Scale"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"hidden"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15889416971203222000,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[3958246774416220000,{"persistent_metadata":{"reference":"Spline","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-36,15]}}},"network_metadata":null}}],[8496292024993914696,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":["Vector Data"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2866788868013687300,{"persistent_metadata":{"reference":"To Group","display_name":"","input_properties":[{"input_data":{"input_name":"Element"},"widget_override":null}],"output_names":["Instances"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[16877573495957869000,{"persistent_metadata":{"reference":"Merge","display_name":"Star","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":10}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13394621587544123000,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[13907401402762847509,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":["Vector Data"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-50,21]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[17790961655412892000,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"mode":"Range","is_integer":false,"input_name":"Random Scale Min","blank_assist":true,"range_max":2,"range_min":0,"min":0,"tooltip":"Minimum range of randomized sizes given to each instance","unit":"x"},"widget_override":"number"},{"input_data":{"unit":"x","blank_assist":true,"min":0,"range_max":2,"range_min":0,"mode":"Range","tooltip":"Minimum range of randomized sizes given to each instance","input_name":"Random Scale Max","is_integer":false},"widget_override":"number"},{"input_data":{"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","input_name":"Random Scale Bias","is_integer":false,"mode":"Range","range_min":-50,"blank_assist":true,"range_max":50},"widget_override":"number"},{"input_data":{"blank_assist":true,"input_name":"Random Scale Seed","min":0,"mode":"Increment","is_integer":true,"tooltip":"Seed to determine unique variations on all the randomized instance sizes"},"widget_override":"number"},{"input_data":{"unit":"°","blank_assist":true,"max":360,"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","mode":"Range","input_name":"Random Rotation","is_integer":false,"min":0},"widget_override":"number"},{"input_data":{"blank_assist":true,"tooltip":"Seed to determine unique variations on all the randomized instance angles","is_integer":true,"mode":"Increment","input_name":"Random Rotation Seed","min":0},"widget_override":"number"}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[655907162126315400,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-50,15]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2908374490615384600,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[6559102076450693000,{"persistent_metadata":{"reference":"To Group","display_name":"","input_properties":[{"input_data":{"input_name":"Element"},"widget_override":null}],"output_names":["Instances"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[16765094648901306000,{"persistent_metadata":{"reference":"Merge","display_name":"Bulb Housing","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13371003476981866000,{"persistent_metadata":{"reference":"Merge","display_name":"Bulb Glow Gradient","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Absolute":[-29,18]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4534782777857480700,{"persistent_metadata":{"reference":"Merge","display_name":"Star Base","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[527.9166666666665,-576.1833333333332],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,1518.0,4.0],"node_graph_top_right":[1980.796875,0.0]},"selection_undo_history":[[],[2866788868013687300],[],[4352028121261571600],[],[2866788868013687300],[6559102076450693000],[6559102076450693000],[10775791528628074000],[],[6559102076450693000],[],[],[],[],[],[15084833709935380000],[],[16765094648901306000],[16765094648901306000,11815560782623298000],[16765094648901306000,13371003476981866000,11815560782623298000],[6559102076450693000,16765094648901306000,13394621587544123000,11815560782623298000,2866788868013687300,13371003476981866000],[3958246774416220000],[],[],[3958246774416220000],[3958246774416220000,655907162126315400],[],[3958246774416220000],[],[3958246774416220000],[655907162126315400,3958246774416220000],[],[],[3958246774416220000],[655907162126315400,3958246774416220000],[],[14631609508767818000],[],[5737014828407011000],[],[10118219203151733000],[],[],[],[],[],[],[655907162126315400],[],[],[655907162126315400,3958246774416220000],[],[],[16877573495957869000],[11411423299989983000],[16877573495957869000],[3471929742275053000],[11411423299989983000],[11411423299989983000,15209576944107258000],[15209576944107258000,3287844738046380000,11411423299989983000],[15209576944107258000,3287844738046380000,11411423299989983000,3958246774416220000],[3958246774416220000,655907162126315400,15209576944107258000,11411423299989983000,3287844738046380000],[4248875763694880300],[11411423299989983000],[3471929742275053000],[11411423299989983000],[15223368326030279287],[11815560782623298000],[11815560782623298000,16765094648901306000],[11815560782623298000],[13371003476981866000],[16765094648901306000],[15223368326030279287],[13371003476981866000],[13371003476981866000,16765094648901306000,11815560782623298000],[13371003476981866000],[11815560782623298000],[16765094648901306000],[13371003476981866000],[16765094648901306000],[11815560782623298000],[13371003476981866000],[11815560782623298000],[13371003476981866000],[16765094648901306000],[13371003476981866000],[16877573495957869000],[16765094648901306000],[13371003476981866000],[16765094648901306000],[11411423299989983000],[]],"selection_redo_history":[]}}},"collapsed":[],"name":"Procedural String Lights","commit_hash":"95bbc95606ba40ed7441fdf4e1b954d80b72e3dc","document_ptz":{"pan":[-500.157717622685,-499.8045823704831],"tilt":0.0,"zoom":1.0,"flip":false},"document_mode":"DesignMode","view_mode":"Normal","overlays_visibility_settings":{"all":true,"artboard_name":true,"compass_rose":true,"quick_measurement":true,"transform_measurement":true,"transform_cage":true,"hover_outline":true,"selection_outline":true,"pivot":true,"path":true,"anchors":true,"handles":true},"rulers_visible":true,"snapping_state":{"snapping_enabled":true,"grid_snapping":false,"artboards":true,"tolerance":8.0,"bounding_box":{"center_point":true,"corner_point":true,"edge_midpoint":true,"align_with_edges":true,"distribute_evenly":true},"path":{"anchor_point":true,"line_midpoint":true,"along_path":true,"normal_to_path":true,"tangent_to_path":true,"path_intersection_point":true,"align_with_anchor_point":true,"perpendicular_from_endpoint":true},"grid":{"origin":[0.0,0.0],"grid_type":{"Rectangular":{"spacing":[1.0,1.0]}},"rectangular_spacing":[1.0,1.0],"isometric_y_spacing":1.0,"isometric_angle_a":30.0,"isometric_angle_b":30.0,"grid_color":{"red":0.6038274,"green":0.6038274,"blue":0.6038274,"alpha":1.0},"dot_display":false}},"graph_view_overlay_open":false,"graph_fade_artwork_percentage":80.0} \ No newline at end of file diff --git a/demo-artwork/red-dress.graphite b/demo-artwork/red-dress.graphite index 96c0bf0ca0..3501120cda 100644 --- a/demo-artwork/red-dress.graphite +++ b/demo-artwork/red-dress.graphite @@ -1 +1 @@ -{"network_interface":{"network":{"exports":[{"Node":{"node_id":2394762731964337494,"output_index":0,"lambda":false}}],"nodes":[[10127467043900015225,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2],"remove":[],"delta":[[1,[258.00000000000006,994.6666666666664]],[2,[644.0,726.6666666666666]]]},"segments":{"add":[1],"remove":[],"start_point":[[1,1]],"end_point":[[1,2]],"handle_primary":[[1,[0.0,0.0]]],"handle_end":[[1,[-328.66666666666674,129.33333333333337]]],"stroke":[[1,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15961046538654083626,{"inputs":[{"Node":{"node_id":1889157037801767612,"output_index":0,"lambda":false}},{"Node":{"node_id":4332145463108161926,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":0.5},"exposed":false}},{"Value":{"tagged_value":{"F64":10.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[17378885078543074499,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7,8],"remove":[],"delta":[[5,[740.4444444444443,857.1111111111111]],[6,[725.7777777777779,1026.370370370371]],[1,[823.2222222222221,660.4444444444445]],[7,[727.5555555555554,1026.6666666666663]],[8,[746.0000000000001,842.9999999999999]],[2,[745.5,826.0]],[4,[709.5555555555554,1026.6666666666667]],[3,[707.5,1026.5]]]},"segments":{"add":[1,2,3,4,5,6,7,8],"remove":[],"start_point":[[2,2],[4,4],[1,1],[3,3],[5,5],[8,8],[6,6],[7,7]],"end_point":[[4,5],[5,6],[8,1],[2,3],[6,7],[3,4],[1,2],[7,8]],"handle_primary":[[8,[17.33333333333337,-84.99999999999989]],[6,[0.0,0.0]],[1,[0.0,0.0]],[2,[-24.5,85.0]],[5,[0.0,0.0]],[3,[0.0,0.0]],[4,[0.0,0.0]],[7,[0.0,0.0]]],"handle_end":[[5,[-7.555555555555884,-59.25925925925992]],[7,[-26.8034437596026,131.4399645903585]],[2,[0.0,0.0]],[1,[24.5,-85.0]],[4,[-23.11111111111109,90.44444444444456]],[3,[0.0,0.0]],[6,[0.0,0.0]],[8,[1.772016460905547,0.9591220850479658]]],"stroke":[[5,0],[4,0],[3,0],[8,0],[6,0],[2,0],[1,0],[7,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":8}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14537754528543289381,{"inputs":[{"Node":{"node_id":1689789805659535712,"output_index":0,"lambda":false}},{"Node":{"node_id":17364155187784942740,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11656581020969095354,{"inputs":[{"Node":{"node_id":8413863870096329943,"output_index":0,"lambda":false}},{"Node":{"node_id":9698363115186534174,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[1500690448497424903,{"inputs":[{"Node":{"node_id":15857077552290328068,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4350324834849900949,{"inputs":[{"Node":{"node_id":6672826052605647592,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[15857077552290328068,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[1,[848.8888888888889,330.66666666666663]],[4,[702.2222222222222,621.3333333333333]],[3,[740.0,516.0]],[2,[820.8888888888889,395.55555555555554]]]},"segments":{"add":[1,2,3],"remove":[],"start_point":[[2,2],[1,1],[3,3]],"end_point":[[1,2],[3,4],[2,3]],"handle_primary":[[2,[-15.111111111111086,22.66666666666663]],[1,[0.0,0.0]],[3,[-17.77777777777783,35.55555555555554]]],"handle_end":[[2,[17.77777777777783,-35.55555555555554]],[1,[15.111111111111086,-22.66666666666663]],[3,[6.222222222222172,-38.66666666666674]]],"stroke":[[3,0],[2,0],[1,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15735375935164094402,{"inputs":[{"Node":{"node_id":3414873131936208778,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[15239301303367148581,{"inputs":[{"Node":{"node_id":11268046366284173800,"output_index":0,"lambda":false}},{"Node":{"node_id":5269304445610080925,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[615144098061106242,{"inputs":[{"Node":{"node_id":14675232891471617236,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.84705883,"green":0.5372549,"blue":0.38431373,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.84705883,"green":0.5372549,"blue":0.38431373,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[9605881532464442500,{"inputs":[{"Node":{"node_id":14029368390543839187,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11058365317860779469,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7],"remove":[],"delta":[[5,[479.00000000000006,817.0]],[2,[242.0,917.0]],[6,[368.0,902.6666666666669]],[7,[311.3333333333333,1018.6666666666666]],[3,[352.0,833.0]],[4,[397.3333333333333,770.6666666666666]],[1,[181.0,1023.0]]]},"segments":{"add":[1,2,3,4,5,6,7],"remove":[],"start_point":[[7,7],[5,5],[6,6],[3,3],[1,1],[2,2],[4,4]],"end_point":[[6,7],[5,6],[4,5],[7,1],[1,2],[2,3],[3,4]],"handle_primary":[[3,[37.4110841377784,-16.935189837826556]],[7,[0.0,0.0]],[5,[-35.31654570364651,23.463149348287175]],[1,[0.0,0.0]],[2,[40.0718943376238,-39.16116946631416]],[6,[0.0,0.0]],[4,[0.0,0.0]]],"handle_end":[[2,[-37.4110841377784,16.935189837826556]],[3,[0.0,0.0]],[4,[35.31654570364611,-23.463149348286947]],[5,[45.99999999999994,-52.00000000000023]],[6,[18.0,-55.33333333333326]],[1,[-40.071894337623746,39.16116946631416]],[7,[0.0,1.3333333333337123]]],"stroke":[[6,0],[1,0],[3,0],[7,0],[2,0],[4,0],[5,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":7}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14946189826912398678,{"inputs":[{"Node":{"node_id":10086073308516686449,"output_index":0,"lambda":false}},{"Node":{"node_id":12030171742672119253,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11553850607251055696,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7,8],"remove":[],"delta":[[5,[619.2812071330591,124.6639231824417]],[4,[608.570644718793,131.2482853223594]],[2,[596.631001371742,112.37311385459536]],[3,[594.085048010974,128.61454046639233]],[1,[597.5967078189302,96.04389574759946]],[6,[609.9753086419754,133.5308641975309]],[8,[594.962962962963,111.93415637860085]],[7,[591.5390946502059,128.7023319615912]]]},"segments":{"add":[1,2,3,4,5,6,7,8],"remove":[],"start_point":[[4,4],[8,8],[2,2],[7,7],[3,3],[6,6],[5,5],[1,1]],"end_point":[[3,4],[7,8],[2,3],[1,2],[4,5],[8,1],[6,7],[5,6]],"handle_primary":[[5,[0.0,0.0]],[7,[-2.3703703703704377,-6.057613168724245]],[4,[4.038408779149563,-1.492455418381354]],[3,[3.5534615822588194,4.6302681223374975]],[8,[4.1262002743484345,-6.935528120713329]],[6,[-7.286694101508829,3.0727023319615796]],[2,[-4.126200274348321,7.1111111111111]],[1,[0.0,0.0]]],"handle_end":[[8,[-0.0877914951989851,0.08779149519889984]],[7,[-4.1262002743484345,6.935528120713272]],[4,[0.0,0.0]],[1,[4.126200274348321,-7.111111111111114]],[2,[-2.8971193415636662,-3.7750342935528063]],[6,[2.3703703703704377,6.057613168724259]],[5,[7.286694101508829,-3.0727023319615796]],[3,[-4.038408779149563,1.492455418381354]]],"stroke":[[1,0],[2,0],[7,0],[6,0],[5,0],[8,0],[3,0],[4,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":8}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4453139144069993994,{"inputs":[{"Node":{"node_id":11804065810513502701,"output_index":0,"lambda":false}},{"Node":{"node_id":3955326429435439190,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[5040278174920511484,{"inputs":[{"Node":{"node_id":14345191642063772510,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[4577174813962563383,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[1,[681.3689965686843,65.32157692417977]],[2,[681.8346756482305,95.35045043533154]],[4,[683.6813083078299,66.11925839089211]],[3,[682.7287205627164,97.04177207029592]]]},"segments":{"add":[1,2,3,4],"remove":[],"start_point":[[1,1],[2,2],[4,4],[3,3]],"end_point":[[4,1],[3,4],[2,3],[1,2]],"handle_primary":[[2,[0.0,0.0]],[1,[0.0,0.0]],[4,[-1.0406539360374154,-1.1405457962673182]],[3,[-1.544754703853414,-12.605862910106907]]],"handle_end":[[1,[-2.6406503472093164,-12.592334294499352]],[3,null],[2,[-0.5302752037773644,-0.69223185792994]],[4,[-1.1368683772161605e-13,-1.4210854715202004e-14]]],"stroke":[[2,0],[4,0],[1,0],[3,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":4}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14225285635863713990,{"inputs":[{"Node":{"node_id":8410534738018320047,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"DVec2":[25.333333333333485,12.641975308641918]},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[1.0,1.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.5,0.5]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2368785048463929131,{"inputs":[{"Node":{"node_id":13269760558336088742,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11899713172487274471,{"inputs":[{"Node":{"node_id":9954843247420111867,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[6580280438672662494,{"inputs":[{"Node":{"node_id":15395954548128560685,"output_index":0,"lambda":false}},{"Node":{"node_id":14598755603287563819,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[17967471489196302183,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[3,[334.8148148148148,1025.4814814814813]],[2,[568.8888888888889,785.4814814814813]],[1,[339.25925925925924,1025.185185185185]]]},"segments":{"add":[1,2,3],"remove":[],"start_point":[[3,3],[1,1],[2,2]],"end_point":[[2,3],[3,1],[1,2]],"handle_primary":[[3,[0.0,0.0]],[1,[0.0,0.0]],[2,[0.0,0.0]]],"handle_end":[[3,null],[1,[-209.77777777777777,108.44444444444468]],[2,[42.07407407407419,-157.6296296296293]]],"stroke":[[2,0],[3,0],[1,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":3}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10086073308516686449,{"inputs":[{"Value":{"tagged_value":{"GraphicGroup":{"instance":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":3971837674569123876,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4222034829755771252,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[2,[155.25925925925927,256.7901234567901]],[1,[165.5308641975309,250.07407407407408]],[4,[161.6241426611797,258.3703703703704]],[3,[152.49382716049382,262.71604938271605]]]},"segments":{"add":[1,2,3,4],"remove":[],"start_point":[[3,3],[1,1],[2,2],[4,4]],"end_point":[[2,3],[4,1],[1,2],[3,4]],"handle_primary":[[3,[0.0,0.0]],[4,[2.7654320987654444,-3.950617283950635]],[2,[-1.9753086419753176,0.790123456790127]],[1,[0.0,0.0]]],"handle_end":[[3,[-2.7654320987654444,3.950617283950635]],[2,[-0.3950617283950919,-1.7777777777777717]],[1,[1.9753086419753176,-0.790123456790127]],[4,[0.0,0.0]]],"stroke":[[4,0],[1,0],[3,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":4}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4307303572241320716,{"inputs":[{"Node":{"node_id":4265165189651403984,"output_index":0,"lambda":false}},{"Node":{"node_id":4572557574846980832,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2878992817082507910,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[1,[777.4814814814814,867.5555555555555]],[2,[738.074074074074,1027.2592592592591]],[3,[741.6296296296296,1027.5555555555557]]]},"segments":{"add":[1,2,3],"remove":[],"start_point":[[2,2],[1,1],[3,3]],"end_point":[[1,2],[3,1],[2,3]],"handle_primary":[[1,[0.0,0.0]],[3,[0.0,0.0]],[2,[0.0,0.0]]],"handle_end":[[3,[-25.185185185185105,132.14814814814804]],[2,[0.0,0.0]],[1,[0.0,0.0]]],"stroke":[[3,0],[2,0],[1,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":3}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[9863310024364795214,{"inputs":[{"Node":{"node_id":5278509881589546420,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[11025165626998987360,{"inputs":[{"Node":{"node_id":5326536612985524219,"output_index":0,"lambda":false}},{"Node":{"node_id":4332145463108161926,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":40.0},"exposed":false}},{"Value":{"tagged_value":{"F64":-15.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[15982852655074258238,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2],"remove":[],"delta":[[2,[798.222222222222,639.8024691358025]],[1,[837.9999999999998,535.8024691358025]]]},"segments":{"add":[1,2],"remove":[],"start_point":[[2,2],[1,1]],"end_point":[[2,1],[1,2]],"handle_primary":[[1,[0.0,0.0]],[2,[31.037037037037067,-61.11111111111131]]],"handle_end":[[2,null],[1,[34.000000000000114,-59.77777777777783]]],"stroke":[[1,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":2}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[17699121037850769131,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[1,[531.1111111111111,364.0]],[4,[158.22222222222223,332.0]],[2,[429.33333333333326,295.1111111111111]],[3,[282.2222222222222,277.3333333333333]]]},"segments":{"add":[1,2,3],"remove":[],"start_point":[[2,2],[3,3],[1,1]],"end_point":[[2,3],[1,2],[3,4]],"handle_primary":[[2,[-56.8888888888888,-24.0]],[1,[0.0,0.0]],[3,[-33.333333333333286,6.666666666666686]]],"handle_end":[[3,[60.0,-41.77777777777777]],[2,[33.333333333333314,-6.666666666666686]],[1,[56.8888888888888,24.0]]],"stroke":[[3,0],[1,0],[2,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[5174744389209053970,{"inputs":[{"Node":{"node_id":12385950900718181935,"output_index":0,"lambda":false}},{"Node":{"node_id":5040278174920511484,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13732749881962071635,{"inputs":[{"Node":{"node_id":7893851488963635918,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":6.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[9778375740427894463,{"inputs":[{"Node":{"node_id":16137033772363318157,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[5002654561220917457,{"inputs":[{"Node":{"node_id":11632506522064533635,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":35.0},"exposed":false}},{"Value":{"tagged_value":{"U32":206},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"u32","alias":null}},"import_index":2}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::PoissonDiskPointsNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[1689789805659535712,{"inputs":[{"Node":{"node_id":15637103575662751567,"output_index":0,"lambda":false}},{"Node":{"node_id":11590691579869262546,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[8699675339613677057,{"inputs":[{"Node":{"node_id":15982852655074258238,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"DVec2":[40.2222222222224,-10.469135802469168]},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[1.0,1.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.5,0.5]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2959546142916532439,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[3,[0.5,1.0]],[1,[0.5,0.0]],[4,[0.0,0.5]],[2,[1.0,0.5]]]},"segments":{"add":[1,2,3,4],"remove":[],"start_point":[[1,1],[4,4],[2,2],[3,3]],"end_point":[[1,2],[4,1],[2,3],[3,4]],"handle_primary":[[2,[0.0,0.27589238888950707]],[4,[0.0,-0.275892388889507]],[3,[-0.275892388889507,0.0]],[1,[0.27589238888950707,0.0]]],"handle_end":[[2,[0.27589238888950707,0.0]],[1,[0.0,-0.275892388889507]],[4,[-0.275892388889507,0.0]],[3,[0.0,0.27589238888950707]]],"stroke":[[3,0],[2,0],[1,0],[4,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":4}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11479098559726891734,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7,8,9,10,11,12],"remove":[],"delta":[[11,[694.9574759945133,76.78829446730683]],[7,[710.5648529187624,103.39887212315196]],[3,[686.5294924554183,63.38545953360767]],[5,[718.310013717421,90.01554641060812]],[2,[669.2053040695015,63.20987654320987]],[8,[709.979576284103,102.93065081542449]],[10,[712.047553726566,86.56241426611797]],[1,[660.660265203475,61.39551897576588]],[12,[683.3104709647919,64.0877914951989]],[9,[717.5491540923639,95.80978509373573]],[4,[704.5560128029263,81.29492455418381]],[6,[717.9588477366254,99.32144490169182]]]},"segments":{"add":[1,2,3,4,5,6,7,8,9,10,11,12],"remove":[],"start_point":[[5,5],[2,2],[10,10],[9,9],[11,11],[3,3],[7,7],[4,4],[6,6],[1,1],[12,12],[8,8]],"end_point":[[7,8],[10,11],[1,2],[6,7],[4,5],[12,1],[5,6],[11,12],[3,4],[2,3],[9,10],[8,9]],"handle_primary":[[6,[-1.9184335509834227,1.995170893022717]],[10,[-4.096936442615174,-1.872885230909901]],[8,[0.0,0.0]],[7,[-0.585276634659408,-0.4682213077274753]],[11,[-5.618655692729931,-7.257430269775952]],[2,[5.4430727023319605,-0.6438042981252892]],[9,[0.17558299039785652,-3.5116598079561214]],[3,[3.4531321444902687,2.1655235482396193]],[4,[8.369455875628773,2.867855509830818]],[1,[0.0,0.0]],[5,[1.1120256058526363,1.9314128943758817]],[12,[-12.8760859625055,-0.4682213077274682]]],"handle_end":[[5,[2.926383173296813,-3.043438500228561]],[10,[5.464020763447934,7.057693486120044]],[9,[4.0931309699032,1.8711455862415676]],[3,[-8.369455875628773,-2.867855509830818]],[11,[4.036165212980222,0.14676964410837456]],[1,[-5.4430727023319605,0.6438042981252892]],[6,[1.706505264591101,-0.4025776799149554]],[8,[-0.17558299039785652,3.511659807956093]],[12,[4.9748513946045705,5.91129401005945]],[7,null],[2,[-3.4853769593560173,-2.1857448728164144]],[4,[-1.8416562954789697,-3.1986661974113133]]],"stroke":[[10,0],[12,0],[2,0],[6,0],[5,0],[3,0],[4,0],[11,0],[9,0],[7,0],[1,0],[8,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":12}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[6282972142629473139,{"inputs":[{"Node":{"node_id":15815816861435910950,"output_index":0,"lambda":false}},{"Node":{"node_id":15578929303912288394,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3406722917122601552,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":1.0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::generator_nodes::CircleNode"}},"visible":true,"skip_deduplication":false}],[16530658574540156160,{"inputs":[{"Node":{"node_id":11666664915283969027,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"DVec2":[23.70370370370381,12.641975308641918]},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[1.0,1.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.5,0.5]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[1167210731467447244,{"inputs":[{"Node":{"node_id":16551385471328831128,"output_index":0,"lambda":false}},{"Node":{"node_id":10432831427187785843,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4248321400839848160,{"inputs":[{"Value":{"tagged_value":{"GraphicGroup":{"instance":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":13231685386999438557,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[907841922684377912,{"inputs":[{"Node":{"node_id":17336535036064625290,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[12219771677493189964,{"inputs":[{"Value":{"tagged_value":{"GraphicGroup":{"instance":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":5140869461760168364,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[9954843247420111867,{"inputs":[{"Node":{"node_id":6988349135757634271,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"DVec2":[0.14046639231827385,0.1473642955124319]},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[1.0,1.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.5,0.5]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10619788176782820865,{"inputs":[{"Node":{"node_id":2397243911096708995,"output_index":0,"lambda":false}},{"Node":{"node_id":1157261387411722141,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14285767317419627814,{"inputs":[{"Node":{"node_id":6749771744300551215,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[12049041947382267086,{"inputs":[{"Node":{"node_id":2959546142916532439,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"DVec2":[25.77777777777777,508.44444444444446]},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[8.0,8.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.5,0.5]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[17891208858820401648,{"inputs":[{"Node":{"node_id":1204243038352113866,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"DVec2":[-7.407407407407391,4.740740740740762]},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[1.0,1.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.5,0.5]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13352561089252322209,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[1,[612.0,1025.3333333333333]],[4,[615.5555555555555,1025.7777777777778]],[3,[752.4444444444443,739.1111111111111]],[2,[749.7777777777777,741.7777777777778]]]},"segments":{"add":[1,2,3,4],"remove":[],"start_point":[[3,3],[1,1],[4,4],[2,2]],"end_point":[[1,2],[2,3],[3,4],[4,1]],"handle_primary":[[2,[0.0,0.0]],[3,[0.0,0.0]],[4,[0.0,0.0]],[1,[0.0,0.0]]],"handle_end":[[3,[28.000000000000114,-107.55555555555544]],[4,[-0.4444444444444571,0.0]],[2,[0.0,0.0]],[1,[-112.0,179.55555555555577]]],"stroke":[[1,0],[2,0],[3,0],[4,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":4}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10689298484366290551,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[1,[156.93571992954355,246.07901729349]],[2,[151.22962962962964,252.1283950617284]],[3,[155.85185185185185,253.03703703703707]]]},"segments":{"add":[1,2,3],"remove":[],"start_point":[[1,1],[3,3],[2,2]],"end_point":[[3,1],[1,2],[2,3]],"handle_primary":[[3,[1.0949818244169762,-0.3546380887060252]],[1,[-2.071522398679349,1.8617234472507391]],[2,[-0.4744436253241133,1.2651830008642833]]],"handle_end":[[1,[0.9481481481481068,-2.5283950617284177]],[2,[-1.0949818244169762,0.3546380887060252]],[3,[1.9215307714004553,1.0902372408288272]]],"stroke":[[1,0],[2,0],[3,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":3}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[1785173043494067496,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[3,[712.0,519.1111111111111]],[2,[636.4444444444443,579.5555555555555]],[1,[566.6666666666666,576.0]],[4,[770.2222222222222,459.1111111111111]]]},"segments":{"add":[1,2,3],"remove":[],"start_point":[[2,2],[3,3],[1,1]],"end_point":[[3,4],[1,2],[2,3]],"handle_primary":[[2,[31.1111111111112,-17.33333333333337]],[3,[18.22222222222217,-21.777777777777715]],[1,[0.0,0.0]]],"handle_end":[[3,[0.0,0.0]],[2,[-18.22222222222217,21.777777777777715]],[1,[-31.1111111111112,17.33333333333337]]],"stroke":[[3,0],[2,0],[1,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[12554368619682347699,{"inputs":[{"Node":{"node_id":3887089796766124876,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":3.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[13261814586176172586,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],"remove":[],"delta":[[10,[755.3580246913581,432.5925925925926]],[13,[736.8888888888889,432.2962962962963]],[14,[782.8148148148148,378.96296296296293]],[8,[686.5302034429451,490.6109861193811]],[11,[719.9999999999999,460.8395061728396]],[4,[858.6666666666666,268.88888888888886]],[2,[827.2592592592594,206.41975308641975]],[16,[809.1851851851852,207.1111111111111]],[12,[715.8518518518517,452.14814814814815]],[5,[829.8271604938273,345.08641975308643]],[7,[680.4331323644109,506.0568995183343]],[3,[851.1111111111111,237.7777777777778]],[1,[799.1111111111112,188.14814814814815]],[6,[775.5061728395061,429.23456790123464]],[9,[758.716049382716,441.8765432098765]],[15,[817.4814814814815,272.2962962962963]]]},"segments":{"add":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],"remove":[],"start_point":[[12,12],[4,4],[15,15],[16,16],[7,7],[6,6],[2,2],[3,3],[11,11],[10,10],[5,5],[14,14],[13,13],[1,1],[9,9],[8,8]],"end_point":[[15,16],[14,15],[7,8],[13,14],[9,10],[16,1],[1,2],[2,3],[4,5],[8,9],[10,11],[3,4],[6,7],[5,6],[12,13],[11,12]],"handle_primary":[[11,[0.0,0.0]],[7,null],[2,[0.0,0.0]],[13,[0.0,0.0]],[12,[0.0,0.0]],[3,[9.086419753086489,9.086419753086432]],[16,[0.0,0.0]],[5,[-31.06481223802939,48.93526760703577]],[14,[20.148148148148152,-33.481481481481524]],[8,[37.39536928167615,-11.787670751832536]],[4,[-2.5679012345678984,17.77777777777777]],[10,[0.0,0.0]],[1,[0.0,0.0]],[6,[-36.541158121167314,42.67873357730855]],[15,[5.925925925925867,-34.96296296296299]],[9,[0.0,0.0]]],"handle_end":[[4,[31.06481223802939,-48.93526760703571]],[3,[2.5679012345678984,-17.77777777777777]],[9,[0.0,0.0]],[2,[-9.086419753086489,-9.086419753086432]],[10,[0.0,0.0]],[6,[22.320987654321016,-14.222222222222342]],[12,[0.0,0.0]],[16,[0.0,0.0]],[14,[-5.925925925925867,34.96296296296299]],[15,[6.51851851851859,11.851851851851848]],[13,[-20.148148148148152,33.481481481481524]],[1,[0.0,0.0]],[11,[0.0,0.0]],[5,[18.3855550289378,-21.473654506216747]],[7,null],[8,[-11.555555555555657,17.18518518518522]]],"stroke":[[15,0],[8,0],[13,0],[11,0],[16,0],[6,0],[3,0],[9,0],[10,0],[2,0],[1,0],[4,0],[7,0],[14,0],[12,0],[5,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":16}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11616089678400336955,{"inputs":[{"Node":{"node_id":7026139249717690649,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.8},"exposed":false}},{"Value":{"tagged_value":{"F64":3.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[17336535036064625290,{"inputs":[{"Node":{"node_id":10421722418968896452,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"DVec2":[49.47996245659249,5.913900401382151]},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.9277405532359332,0.9277405532359332]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.5,0.5]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3887089796766124876,{"inputs":[{"Node":{"node_id":15518174914032911052,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":8.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3150436463719911922,{"inputs":[{"Node":{"node_id":18214377096178867498,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[1.0,1.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.5,0.5]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2183999005109815989,{"inputs":[{"Node":{"node_id":3970516859959908758,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[5455777299776842371,{"inputs":[{"Node":{"node_id":9470742171134780193,"output_index":0,"lambda":false}},{"Node":{"node_id":7385465194555106679,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13045580349734858212,{"inputs":[{"Node":{"node_id":10795820039540504703,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"u32","alias":null}},"import_index":2}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::PoissonDiskPointsNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10432831427187785843,{"inputs":[{"Node":{"node_id":2087303479944421366,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14209241002058525241,{"inputs":[{"Node":{"node_id":16290933138334939444,"output_index":0,"lambda":false}},{"Node":{"node_id":10918055532782314571,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[8934999452649011837,{"inputs":[{"Node":{"node_id":16796171662855500935,"output_index":0,"lambda":false}},{"Node":{"node_id":16756940771483104467,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4787732047489141819,{"inputs":[{"Node":{"node_id":12062649793560663566,"output_index":0,"lambda":false}},{"Node":{"node_id":4248321400839848160,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16614450796751955858,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7],"remove":[],"delta":[[5,[807.3333333333334,1026.0]],[6,[845.3333333333333,842.0000000000001]],[2,[757.1358024691358,661.5308641975308]],[3,[481.33333333333337,826.6666666666666]],[7,[918.6666666666664,604.6666666666666]],[4,[327.3333333333333,1024.6666666666663]],[1,[902.6666666666666,446.6666666666667]]]},"segments":{"add":[1,2,3,4,5,6,7],"remove":[],"start_point":[[4,4],[3,3],[7,7],[1,1],[6,6],[5,5],[2,2]],"end_point":[[3,4],[7,1],[2,3],[1,2],[5,6],[6,7],[4,5]],"handle_primary":[[2,[-138.41983388553547,108.26897897977506]],[7,[16.000000000000227,-89.99999999999989]],[4,[0.0,0.0]],[5,[0.0,0.0]],[1,[0.0,0.0]],[3,[-131.33333333333337,78.66666666666652]],[6,[49.4943341398548,-116.98660796692934]]],"handle_end":[[6,[-16.71260304301461,94.00839211695676]],[1,[134.66666666666686,-105.33333333333326]],[5,[-36.66666666666663,86.66666666666652]],[2,[143.2366194125077,-85.79655375977609]],[7,[3.3333333333333712,32.00000000000006]],[4,[0.0,0.0]],[3,[0.0,0.0]]],"stroke":[[5,0],[6,0],[3,0],[4,0],[1,0],[7,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":7}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[6666260895482068061,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[3,[646.4033730994855,154.80329633678198]],[4,[645.3845450388659,135.9012345679012]],[2,[645.6821893629258,155.3850506865855]],[1,[643.0921942512911,135.30336230847865]]]},"segments":{"add":[1,2,3,4],"remove":[],"start_point":[[1,1],[4,4],[3,3],[2,2]],"end_point":[[2,3],[4,1],[3,4],[1,2]],"handle_primary":[[3,[-0.2558402858584259,-10.083527774255913]],[1,[0.0,0.0]],[4,[0.0,0.0]],[2,[0.0,0.0]]],"handle_end":[[4,[1.68322954928135,-0.022087435068414152]],[1,[-0.05703059647760256,-13.444628325495556]],[2,[-0.3446760851414865,0.611494768909921]],[3,[0.0,0.0]]],"stroke":[[1,0],[3,0],[2,0],[4,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":4}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7893851488963635918,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2],"remove":[],"delta":[[1,[125.0,420.0]],[2,[24.0,486.0]]]},"segments":{"add":[1],"remove":[],"start_point":[[1,1]],"end_point":[[1,2]],"handle_primary":[[1,[0.0,0.0]]],"handle_end":[[1,[23.0,-70.0]]],"stroke":[[1,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3802858053991775169,{"inputs":[{"Node":{"node_id":11058365317860779469,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":25.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"u32","alias":null}},"import_index":2}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::PoissonDiskPointsNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11199691961479466803,{"inputs":[{"Node":{"node_id":16756550532943068678,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[18319784717194273926,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7,8,9,10,11,12],"remove":[],"delta":[[3,[167.0,691.0]],[6,[443.1111111111111,783.1111111111111]],[2,[150.22222222222223,568.4444444444445]],[7,[558.6666666666666,749.7777777777778]],[10,[610.6666666666666,712.4444444444443]],[12,[437.99999999999994,690.0]],[1,[172.22222222222217,564.7777777777779]],[5,[418.2222222222222,754.6666666666666]],[8,[706.6666666666666,687.5555555555554]],[11,[595.0,690.0]],[9,[828.0,570.2222222222221]],[4,[574.6666666666666,712.4444444444443]]]},"segments":{"add":[1,2,3,4,5,6,7,8,9,10,11,12],"remove":[],"start_point":[[3,3],[9,9],[5,5],[4,4],[12,12],[1,1],[11,11],[8,8],[7,7],[10,10],[6,6],[2,2]],"end_point":[[1,2],[4,5],[12,1],[9,10],[10,11],[5,6],[2,3],[3,4],[7,8],[8,9],[11,12],[6,7]],"handle_primary":[[1,[0.0,0.0]],[3,[0.0,0.0]],[12,[-98.22222222222224,-28.0]],[11,[0.0,0.0]],[2,[18.111111111111057,85.22222222222229]],[5,[0.0,0.0]],[8,[60.44444444444446,-39.55555555555566]],[4,[0.0,0.0]],[9,[0.0,0.0]],[6,[0.0,0.0]],[7,[32.888888888888914,-13.333333333333483]],[10,[0.0,0.0]]],"handle_end":[[3,[-128.44444444444446,26.22222222222217]],[4,[54.22222222222223,-9.333333333333371]],[7,[-60.44444444444446,39.55555555555566]],[5,[-18.66666666666663,-4.888888888888914]],[10,[-1.3333333333333712,21.77777777777783]],[6,[-32.888888888888914,13.333333333333483]],[2,null],[12,[161.33333333333337,34.66666666666674]],[8,[0.0,0.0]],[11,[98.22222222222224,28.0]],[1,null],[9,[145.77777777777771,-61.777777777777715]]],"stroke":[[5,0],[9,0],[2,0],[10,0],[12,0],[8,0],[11,0],[6,0],[1,0],[3,0],[7,0],[4,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":12}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4479074488343511985,{"inputs":[{"Node":{"node_id":11479098559726891734,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.8980392,"green":0.8,"blue":0.6156863,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8980392,"green":0.8,"blue":0.6156863,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[16756550532943068678,{"inputs":[{"Node":{"node_id":541002100261582638,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16137033772363318157,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[2,[720.417009602195,178.00603566529497]],[1,[688.566255144033,175.3371742112483]],[3,[720.1360768175583,181.58792866941016]]]},"segments":{"add":[1,2,3],"remove":[],"start_point":[[2,2],[3,3],[1,1]],"end_point":[[1,2],[3,1],[2,3]],"handle_primary":[[3,[-1.1237311385458495,-3.125377229080982]],[1,[29.423007364946784,-0.024697364703285984]],[2,[1.8041152263373303,2.00164609053499]]],"handle_end":[[2,null],[1,null],[3,[12.04499314128941,0.8076817558298615]]],"stroke":[[3,0],[2,0],[1,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":3}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3170924135668664007,{"inputs":[{"Node":{"node_id":4787732047489141819,"output_index":0,"lambda":false}},{"Node":{"node_id":13444661581815146533,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16051539163551573193,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5],"remove":[],"delta":[[1,[708.0000000000001,769.3333333333333]],[5,[588.0,930.6666666666666]],[2,[609.7777777777777,896.0]],[4,[519.1111111111111,1026.2222222222222]],[3,[514.6666666666666,1025.7777777777778]]]},"segments":{"add":[1,2,3,4,5],"remove":[],"start_point":[[5,5],[3,3],[4,4],[1,1],[2,2]],"end_point":[[3,4],[2,3],[4,5],[5,1],[1,2]],"handle_primary":[[5,[24.0,-29.77777777777783]],[3,[0.0,0.0]],[1,[0.0,0.0]],[2,[-54.66666666666663,69.33333333333314]],[4,[0.0,0.0]]],"handle_end":[[1,[54.66666666666663,-69.33333333333326]],[2,[0.0,0.0]],[3,[0.0,0.0]],[5,[-28.44444444444457,47.111111111111086]],[4,[-24.0,29.777777777777715]]],"stroke":[[2,0],[1,0],[4,0],[5,0],[3,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":5}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[6292009934909381201,{"inputs":[{"Node":{"node_id":10424806499648491677,"output_index":0,"lambda":false}},{"Node":{"node_id":9778375740427894463,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[1204243038352113866,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2],"remove":[],"delta":[[2,[837.3333333333334,653.6296296296296]],[1,[808.8888888888889,832.2962962962965]]]},"segments":{"add":[1,2],"remove":[],"start_point":[[2,2],[1,1]],"end_point":[[2,1],[1,2]],"handle_primary":[[2,[-26.22222222222217,80.29629629629608]],[1,[0.0,0.0]]],"handle_end":[[2,[0.0,-0.4444444444443434]],[1,[-22.22222222222217,79.40740740740739]]],"stroke":[[2,0],[1,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":2}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4572557574846980832,{"inputs":[{"Node":{"node_id":13014916927589286309,"output_index":0,"lambda":false}},{"Node":{"node_id":4332145463108161926,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":0.5},"exposed":false}},{"Value":{"tagged_value":{"F64":30.0},"exposed":false}},{"Value":{"tagged_value":{"F64":-60.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[17494926338451345058,{"inputs":[{"Node":{"node_id":1167210731467447244,"output_index":0,"lambda":false}},{"Node":{"node_id":9529195152569434392,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14098374807212007572,{"inputs":[{"Node":{"node_id":17494926338451345058,"output_index":0,"lambda":false}},{"Node":{"node_id":10336592647221792772,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[12062649793560663566,{"inputs":[{"Node":{"node_id":5455777299776842371,"output_index":0,"lambda":false}},{"Node":{"node_id":8934999452649011837,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3992858139802231032,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[2,[635.8445358939186,153.225422953818]],[1,[634.615454961134,135.08184727937814]],[4,[645.384545038866,135.90123456790124]],[3,[648.9547325102881,151.8792866941015]]]},"segments":{"add":[1,2,3,4],"remove":[],"start_point":[[1,1],[4,4],[3,3],[2,2]],"end_point":[[4,1],[2,3],[1,2],[3,4]],"handle_primary":[[3,[1.8143575674440624,-2.575217192501128]],[4,[0.0,0.0]],[2,[6.203932327389111,7.491540923639718]],[1,[0.0,0.0]]],"handle_end":[[4,[9.247370827617717,-0.3511659807956278]],[3,[6.730681298582454,7.257430269775966]],[2,[-1.8143575674440624,2.575217192501128]],[1,[-6.203932327389111,-7.491540923639718]]],"stroke":[[4,0],[1,0],[2,0],[3,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":4}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[8091904580702893317,{"inputs":[{"Node":{"node_id":15446793500614592278,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[15492651270767932214,{"inputs":[{"Node":{"node_id":6580280438672662494,"output_index":0,"lambda":false}},{"Node":{"node_id":2698266912167150713,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10918055532782314571,{"inputs":[{"Node":{"node_id":13529118918690401241,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[14029368390543839187,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[2,[668.4444444444445,516.4444444444443]],[3,[808.0,413.33333333333337]],[1,[604.8888888888889,523.5555555555557]]]},"segments":{"add":[1,2],"remove":[],"start_point":[[2,2],[1,1]],"end_point":[[2,3],[1,2]],"handle_primary":[[2,[23.1111111111112,-9.7777777777776]],[1,[0.0,0.0]]],"handle_end":[[1,[-23.1111111111112,9.7777777777776]],[2,[-59.111111111111086,58.22222222222223]]],"stroke":[[1,0],[2,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15896921950407486754,{"inputs":[{"Node":{"node_id":13163272246010991228,"output_index":0,"lambda":false}},{"Node":{"node_id":11199691961479466803,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15466714490303763249,{"inputs":[{"Node":{"node_id":10514847656270897393,"output_index":0,"lambda":false}},{"Node":{"node_id":11659756061767599421,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[12224498203743157414,{"inputs":[{"Node":{"node_id":2878992817082507910,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[13045087323693407920,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2],"remove":[],"delta":[[2,[227.0,496.0]],[1,[19.0,494.0]]]},"segments":{"add":[1],"remove":[],"start_point":[[1,1]],"end_point":[[1,2]],"handle_primary":[[1,[0.0,0.0]]],"handle_end":[[1,[-98.0,-55.0]]],"stroke":[[1,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[8240895922641772563,{"inputs":[{"Node":{"node_id":16530658574540156160,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[13644138583806412631,{"inputs":[{"Node":{"node_id":2641530639940889619,"output_index":0,"lambda":false}},{"Node":{"node_id":12473080738469616517,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11021243031011826737,{"inputs":[{"Node":{"node_id":16446146761452576438,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[17239674500639890523,{"inputs":[{"Node":{"node_id":1785173043494067496,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[17064046832210629373,{"inputs":[{"Node":{"node_id":12219771677493189964,"output_index":0,"lambda":false}},{"Node":{"node_id":11677503666435782605,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10420981328998103391,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[2,[844.4444444444443,460.44444444444434]],[1,[859.5555555555554,375.1111111111111]],[3,[694.2222222222222,623.5555555555554]]]},"segments":{"add":[1,2],"remove":[],"start_point":[[1,1],[2,2]],"end_point":[[1,2],[2,3]],"handle_primary":[[2,[-11.999999999999886,30.6666666666668]],[1,[0.0,0.0]]],"handle_end":[[1,[11.055745483535702,-28.253571791258253]],[2,[76.88888888888891,-30.666666666666742]]],"stroke":[[1,0],[2,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15460109068588328521,{"inputs":[{"Node":{"node_id":5185036609290210853,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.9019608,"green":0.8,"blue":0.6,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.9019608,"green":0.8,"blue":0.6,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[17815494794630739611,{"inputs":[{"Node":{"node_id":14079496619264986678,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[10860592954464951000,{"inputs":[{"Node":{"node_id":4236845268521674740,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[12387541320114693418,{"inputs":[{"Node":{"node_id":5471152581000334146,"output_index":0,"lambda":false}},{"Node":{"node_id":15460109068588328521,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[9182448229950585507,{"inputs":[{"Node":{"node_id":12496143061817048445,"output_index":0,"lambda":false}},{"Node":{"node_id":7320676248579211727,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[431994205232245356,{"inputs":[{"Node":{"node_id":12387541320114693418,"output_index":0,"lambda":false}},{"Node":{"node_id":14894569344576297448,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[12594527670567285670,{"inputs":[{"Node":{"node_id":4663768795652429571,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14345191642063772510,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[1,[880.8888888888888,556.4444444444443]],[4,[838.2222222222222,766.6666666666669]],[3,[813.3557395833334,961.1454375]],[2,[833.7777777777777,780.4444444444443]]]},"segments":{"add":[1,2,3,4],"remove":[],"start_point":[[2,2],[3,3],[1,1],[4,4]],"end_point":[[1,2],[3,4],[4,1],[2,3]],"handle_primary":[[1,[0.0,0.0]],[4,[10.643023589139377,-58.51588472312813]],[3,[0.0,0.0]],[2,[-9.333333333333371,54.66666666666674]]],"handle_end":[[4,[-0.4444444444444571,-0.8888888888888005]],[3,[-10.643023589139377,58.51588472312813]],[2,[0.0,0.0]],[1,[9.333333333333371,-54.66666666666674]]],"stroke":[[3,0],[2,0],[4,0],[1,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":4}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[12531351117929704587,{"inputs":[{"Node":{"node_id":11194653561109699287,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[12385950900718181935,{"inputs":[{"Node":{"node_id":4372998635946271235,"output_index":0,"lambda":false}},{"Node":{"node_id":615144098061106242,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[1713644030979611623,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2],"remove":[],"delta":[[1,[404.0,882.6666666666666]],[2,[321.33333333333326,1022.0]]]},"segments":{"add":[1],"remove":[],"start_point":[[1,1]],"end_point":[[1,2]],"handle_primary":[[1,[0.0,0.0]]],"handle_end":[[1,[30.96296296296316,-100.2222222222224]]],"stroke":[[1,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3649809135741361946,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2],"remove":[],"delta":[[2,[841.3333333333333,336.8888888888889]],[1,[787.1111111111111,414.66666666666663]]]},"segments":{"add":[1],"remove":[],"start_point":[[1,1]],"end_point":[[1,2]],"handle_primary":[[1,[0.0,0.0]]],"handle_end":[[1,[-21.333333333333258,48.888888888888914]]],"stroke":[[1,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[5213978458941436169,{"inputs":[{"Node":{"node_id":13261814586176172586,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":7.0},"exposed":false}},{"Value":{"tagged_value":{"U32":10},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"u32","alias":null}},"import_index":2}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::PoissonDiskPointsNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4663768795652429571,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6],"remove":[],"delta":[[3,[708.8285322359397,101.48696844993144]],[4,[713.0620332266423,107.3007163542143]],[6,[706.633744855967,98.10699588477364]],[1,[691.7530864197531,86.91358024691357]],[2,[696.6255144032922,96.92181069958846]],[5,[710.8379820149368,102.96966925773508]]]},"segments":{"add":[1,2,3,4,5,6],"remove":[],"start_point":[[2,2],[5,5],[6,6],[1,1],[4,4],[3,3]],"end_point":[[1,2],[6,1],[2,3],[3,4],[4,5],[5,6]],"handle_primary":[[4,[0.0,0.0]],[5,[-0.8974241731443726,-2.770309404054231]],[6,[-6.847736625514244,-2.3703703703703525]],[1,[0.0,0.0]],[2,[6.057613168724288,1.9753086419753032]],[3,[1.7753391251332005,4.7992684042066]]],"handle_end":[[2,[-0.7886938944185431,-2.1320736046921525]],[5,[2.9051419934493197,1.005626074655538]],[6,[1.1851851851849915,8.823045267489718]],[1,[-6.057613168724288,-1.9753086419753032]],[4,[0.786301337230384,2.4272780410153985]],[3,[-0.9218106995884908,-0.3950617283950635]]],"stroke":[[4,0],[5,0],[2,0],[3,0],[6,0],[1,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":6}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10599660455959346550,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[4,[745.3333333333333,471.55555555555554]],[1,[478.2222222222222,515.1111111111111]],[3,[654.6666666666666,546.6666666666666]],[2,[572.0,570.2222222222222]]]},"segments":{"add":[1,2,3],"remove":[],"start_point":[[2,2],[1,1],[3,3]],"end_point":[[1,2],[2,3],[3,4]],"handle_primary":[[2,[31.555555555555543,7.555555555555543]],[3,[26.222222222222285,-16.0]],[1,[0.0,0.0]]],"handle_end":[[2,[-26.222222222222285,16.0]],[3,[0.0,0.0]],[1,[-31.555555555555543,-7.555555555555543]]],"stroke":[[3,0],[2,0],[1,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16756940771483104467,{"inputs":[{"Node":{"node_id":13975451746581400000,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.84705883,"green":0.5372549,"blue":0.38431373,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.84705883,"green":0.5372549,"blue":0.38431373,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[17207895962122263432,{"inputs":[{"Node":{"node_id":3968318310636120842,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[2175432926627256613,{"inputs":[{"Value":{"tagged_value":{"GraphicGroup":{"instance":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":14982414026754548178,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[17945736750161448391,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[2,[688.3433248095167,92.67923984990472]],[4,[687.6968543916372,70.6398816184091]],[3,[687.4660700953133,94.52064202140812]],[1,[689.4327280262556,73.68042956754955]]]},"segments":{"add":[1,2,3,4],"remove":[],"start_point":[[4,4],[2,2],[1,1],[3,3]],"end_point":[[1,2],[3,4],[2,3],[4,1]],"handle_primary":[[3,[-0.975596082205584,-10.16276974584038]],[2,[0.0,0.0]],[4,[0.0,0.0]],[1,[-1.460603632035259,12.298077567102167]]],"handle_end":[[4,[-0.3670368206467174,-1.6914035044494111]],[2,[0.6631784948407358,-0.4471776104951459]],[3,[0.0,0.0]],[1,null]],"stroke":[[3,0],[4,0],[1,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":4}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16324258033206362312,{"inputs":[{"Node":{"node_id":7472360693015927574,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.0},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[14079496619264986678,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[1,[597.2345679012346,77.92592592592592]],[2,[608.9876543209878,75.25925925925925]],[3,[609.2839506172841,76.74074074074073]]]},"segments":{"add":[1,2,3],"remove":[],"start_point":[[1,1],[2,2],[3,3]],"end_point":[[3,1],[1,2],[2,3]],"handle_primary":[[2,[0.0,0.0]],[1,[0.0,0.0]],[3,[0.0,0.0]]],"handle_end":[[2,[0.0,0.0]],[1,[-6.222222222222172,-0.9876543209876588]],[3,[8.09876543209873,0.2962962962962763]]],"stroke":[[2,0],[3,0],[1,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":3}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10253927692147706615,{"inputs":[{"Node":{"node_id":9605881532464442500,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[17797565855444771977,{"inputs":[{"Node":{"node_id":1713644030979611623,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[9529195152569434392,{"inputs":[{"Node":{"node_id":3121275823460307102,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[12876462860151722087,{"inputs":[{"Node":{"node_id":10619788176782820865,"output_index":0,"lambda":false}},{"Node":{"node_id":10415872992231003638,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15303587427289959766,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2],"remove":[],"delta":[[2,[818.2222222222222,566.2222222222222]],[1,[610.6666666666666,706.6666666666666]]]},"segments":{"add":[1],"remove":[],"start_point":[[1,1]],"end_point":[[1,2]],"handle_primary":[[1,[0.0,0.0]]],"handle_end":[[1,[-82.66666666666674,97.77777777777771]]],"stroke":[[1,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[12761901161949743155,{"inputs":[{"Node":{"node_id":7659717355245331967,"output_index":0,"lambda":false}},{"Node":{"node_id":8091904580702893317,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11268046366284173800,{"inputs":[{"Node":{"node_id":4453139144069993994,"output_index":0,"lambda":false}},{"Node":{"node_id":11616089678400336955,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[6416452251137958677,{"inputs":[{"Node":{"node_id":17797565855444771977,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[11194653561109699287,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6],"remove":[],"delta":[[1,[604.3716161316235,95.4260819221956]],[5,[602.0316509633005,90.5516059992284]],[4,[605.761316872428,82.28989483310471]],[2,[607.4000914494741,86.85505258344766]],[6,[603.4567901234567,92.83950617283948]],[3,[623.4951989026065,81.23639689071788]]]},"segments":{"add":[1,2,3,4,5,6],"remove":[],"start_point":[[6,6],[4,4],[2,2],[5,5],[3,3],[1,1]],"end_point":[[3,4],[4,5],[1,2],[2,3],[6,1],[5,6]],"handle_primary":[[2,[3.687242798354191,-3.4531321444901835]],[5,[0.0,0.0]],[1,[0.0,0.0]],[3,[-0.7803688462123546,-2.7117817405883216]],[4,[-3.2460274482192517,2.85650415443304]],[6,[0.3965701826469967,0.8240731861035471]]],"handle_end":[[6,[-2.273736754432321e-13,-4.263256414560601e-14]],[5,[-0.3896135191956773,-0.8096172333722365]],[1,[-3.3249738510837687,3.113864400221118]],[4,[-0.10095077423932251,-1.27829797882373]],[3,[4.389574759945049,-3.862825788751721]],[2,[-1.0144795000761633,1.6192653558908745]]],"stroke":[[6,0],[2,0],[3,0],[4,0],[5,0],[1,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":6}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14887821801874852671,{"inputs":[{"Node":{"node_id":8230694129617719636,"output_index":0,"lambda":false}},{"Node":{"node_id":18279507457571359732,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7747398671834040298,{"inputs":[{"Node":{"node_id":18319784717194273926,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":30.0},"exposed":false}},{"Value":{"tagged_value":{"U32":47},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"u32","alias":null}},"import_index":2}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::PoissonDiskPointsNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[1869448627329502330,{"inputs":[{"Node":{"node_id":2478872006455149410,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[16796171662855500935,{"inputs":[{"Node":{"node_id":14993053984267866751,"output_index":0,"lambda":false}},{"Node":{"node_id":9371909264427723282,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14012648643507848353,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[2,[613.7152263374486,29.076543209876547]],[1,[610.080658436214,28.760493827160495]],[3,[615.7168724279835,33.05349794238683]],[4,[613.6098765432099,30.393415637860084]]]},"segments":{"add":[1,2,3,4],"remove":[],"start_point":[[1,1],[2,2],[4,4],[3,3]],"end_point":[[4,1],[3,4],[2,3],[1,2]],"handle_primary":[[2,[1.5990193552247547,1.4582133097558128]],[3,[0.0,0.0]],[1,[0.0,0.0]],[4,[-1.3168724279836397,-1.343209876543213]]],"handle_end":[[3,[0.7962610294339356,0.812186250022549]],[4,[0.05267489711934559,0.02633744855966924]],[1,[-1.447323438899616,-1.3198753943965968]],[2,[-0.05267489711934559,-0.9218106995884768]]],"stroke":[[1,0],[2,0],[3,0],[4,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":4}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11610326709040542828,{"inputs":[{"Node":{"node_id":16649851742084147477,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14894569344576297448,{"inputs":[{"Node":{"node_id":5555007473125503522,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[7525593029671097583,{"inputs":[{"Node":{"node_id":16175421708184657649,"output_index":0,"lambda":false}},{"Node":{"node_id":15735375935164094402,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15578929303912288394,{"inputs":[{"Node":{"node_id":10770443343193024138,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[10133176481349663495,{"inputs":[{"Node":{"node_id":12876462860151722087,"output_index":0,"lambda":false}},{"Node":{"node_id":11021243031011826737,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4332145463108161926,{"inputs":[{"Node":{"node_id":3406722917122601552,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[9740500978584792725,{"inputs":[{"Node":{"node_id":14946189826912398678,"output_index":0,"lambda":false}},{"Node":{"node_id":10586744777717861556,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10421722418968896452,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[2,[683.3689986282578,99.49702789208962]],[3,[691.7384545038866,78.07590306355738]],[1,[677.8673982624599,66.19478737997257]]]},"segments":{"add":[1,2,3],"remove":[],"start_point":[[1,1],[3,3],[2,2]],"end_point":[[3,1],[1,2],[2,3]],"handle_primary":[[2,[0.34676700844204333,0.512429191350904]],[1,[-0.49434169374126213,0.7369041683249975]],[3,[0.12630166293718048,-1.7247569518707309]]],"handle_end":[[3,[5.6142033131263815,-8.368968014727507]],[2,[-1.4537474229852023,19.852161212683583]],[1,[-7.636184307015128,-11.284244620129414]]],"stroke":[[1,0],[2,0],[3,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":3}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16551385471328831128,{"inputs":[{"Node":{"node_id":14991324592500870173,"output_index":0,"lambda":false}},{"Node":{"node_id":17207349373429328029,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[6532401937876437300,{"inputs":[{"Node":{"node_id":3992858139802231032,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[1.0,1.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.5,0.5]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[9688677048860875577,{"inputs":[{"Node":{"node_id":17699121037850769131,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[6988349135757634271,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[1,[189.14614932392712,263.9984322947286]],[2,[188.0493827160494,269.116049382716]],[3,[183.0891632373113,268.771154223006]],[4,[184.5962505715592,263.55006858710567]]]},"segments":{"add":[1,2,3,4],"remove":[],"start_point":[[3,3],[1,1],[2,2],[4,4]],"end_point":[[4,1],[1,2],[2,3],[3,4]],"handle_primary":[[4,[1.697261300324044,-1.9917992948792855]],[2,[-1.9972565157751203,0.9588085439937686]],[1,[1.552958476004363,1.9059035841873424]],[3,[-0.9800640224909783,-1.3570273385153655]]],"handle_end":[[1,[3.459421910557637,-1.6607397492127802]],[2,[1.0091841400482906,1.3973479652491392]],[4,[-1.464617942413156,-1.7974856565980986]],[3,[-1.5959762231368018,1.872937487752267]]],"stroke":[[4,0],[2,0],[1,0],[3,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":4}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[1384427686127078856,{"inputs":[{"Node":{"node_id":17064046832210629373,"output_index":0,"lambda":false}},{"Node":{"node_id":17529660518597229229,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7849528090737558776,{"inputs":[{"Node":{"node_id":11356586238302409958,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14057307926677215422,{"inputs":[{"Node":{"node_id":5861306074868809692,"output_index":0,"lambda":false}},{"Node":{"node_id":7450965328305122110,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3971837674569123876,{"inputs":[{"Node":{"node_id":7849528090737558776,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":3.3528},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[4832236468224231783,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2],"remove":[],"delta":[[2,[369.77777777777777,381.7777777777778]],[1,[232.44444444444443,332.8888888888889]]]},"segments":{"add":[1],"remove":[],"start_point":[[1,1]],"end_point":[[1,2]],"handle_primary":[[1,[0.0,0.0]]],"handle_end":[[1,[-73.77777777777777,-53.77777777777777]]],"stroke":[[1,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14991324592500870173,{"inputs":[{"Node":{"node_id":542361600097372754,"output_index":0,"lambda":false}},{"Node":{"node_id":10860592954464951000,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11630078441485655672,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2],"remove":[],"delta":[[1,[760.6913580246915,657.5802469135803]],[2,[751.4074074074075,685.0370370370371]]]},"segments":{"add":[1,2],"remove":[],"start_point":[[2,2],[1,1]],"end_point":[[1,2],[2,1]],"handle_primary":[[2,[4.543209876543187,-10.271604938271594]],[1,[0.0,0.0]]],"handle_end":[[2,null],[1,[7.111111111110972,-8.44444444444457]]],"stroke":[[2,0],[1,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":2}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3970516859959908758,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[2,[78.22222222222219,579.2592592592591]],[3,[170.96296296296293,544.5925925925925]],[1,[49.77777777777773,636.148148148148]]]},"segments":{"add":[1,2],"remove":[],"start_point":[[2,2],[1,1]],"end_point":[[2,3],[1,2]],"handle_primary":[[1,[0.0,0.0]],[2,[27.259259259259252,-24.88888888888891]]],"handle_end":[[1,[-27.259259259259267,24.88888888888891]],[2,[-21.62962962962962,-2.0740740740740193]]],"stroke":[[1,0],[2,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13302269488061286120,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2],"remove":[],"delta":[[1,[262.66666666666674,903.3333333333331]],[2,[565.3333333333335,756.6666666666666]]]},"segments":{"add":[1],"remove":[],"start_point":[[1,1]],"end_point":[[1,2]],"handle_primary":[[1,[0.0,0.0]]],"handle_end":[[1,[-200.66666666666652,64.66666666666663]]],"stroke":[[1,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[1889157037801767612,{"inputs":[{"Node":{"node_id":17324767436949538365,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":30.0},"exposed":false}},{"Value":{"tagged_value":{"U32":18},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"u32","alias":null}},"import_index":2}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::PoissonDiskPointsNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10270446074640675342,{"inputs":[{"Node":{"node_id":14883504161508594099,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[1.0,1.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.5,0.5]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4078100635676202528,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26],"remove":[],"delta":[[4,[627.9111111111112,43.73333333333333]],[19,[613.4518518518519,26.429629629629623]],[16,[661.0962962962963,35.792592592592584]],[7,[684.4444444444445,46.1037037037037]],[25,[604.6288065843622,39.321810699588475]],[9,[642.4888888888889,44.44444444444444]],[6,[676.2666666666667,48.47407407407407]],[20,[601.2444444444444,36.859259259259254]],[14,[698.3111111111111,43.61481481481481]],[13,[707.0814814814814,53.33333333333333]],[26,[607.3152263374486,46.38024691358025]],[12,[683.3777777777777,50.48888888888889]],[11,[665.4814814814815,56.05925925925925]],[17,[639.762962962963,37.45185185185185]],[3,[613.4518518518519,35.43703703703703]],[18,[621.2740740740741,37.21481481481481]],[22,[607.6312757201646,47.64444444444445]],[8,[667.2592592592594,52.029629629629625]],[24,[605.998353909465,33.79094650205761]],[1,[606.3407407407408,47.76296296296296]],[10,[653.1555555555556,49.89629629629629]],[2,[603.4962962962964,36.977777777777774]],[5,[653.9851851851852,38.99259259259259]],[15,[677.925925925926,46.222222222222214]],[23,[608.5794238683127,44.82633744855967]],[21,[605.3925925925926,49.42222222222222]]]},"segments":{"add":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26],"remove":[],"start_point":[[20,20],[7,7],[5,5],[13,13],[15,15],[10,10],[2,2],[8,8],[24,24],[26,26],[18,18],[6,6],[1,1],[14,14],[9,9],[4,4],[16,16],[17,17],[19,19],[11,11],[21,21],[22,22],[3,3],[25,25],[23,23],[12,12]],"end_point":[[24,25],[18,19],[12,13],[25,26],[16,17],[26,1],[6,7],[22,23],[8,9],[17,18],[19,20],[1,2],[13,14],[21,22],[5,6],[2,3],[23,24],[4,5],[11,12],[10,11],[3,4],[20,21],[9,10],[14,15],[7,8],[15,16]],"handle_primary":[[18,[-3.437037037037044,-4.148148148148145]],[9,[0.0,0.0]],[2,[2.1333333333333258,-5.68888888888889]],[7,[0.0,0.0]],[5,[10.311111111111131,0.5925925925925952]],[19,[-3.3185185185185446,-1.1851851851851831]],[26,[0.0,0.0]],[16,[-5.214814814814758,-1.3037037037037038]],[13,[0.0,0.0]],[12,[6.9925925925927,-4.740740740740748]],[15,[-2.844444444444548,-0.829629629629629]],[24,[0.0,0.0]],[1,[0.0,0.0]],[14,[-10.90370370370374,-2.6074074074074076]],[8,[-10.666666666666629,-0.7111111111111157]],[17,[-6.992592592592587,2.962962962962962]],[11,[3.318518518518431,-0.11851851851851336]],[20,[-1.5407407407407163,8.651851851851852]],[22,[0.0,0.0]],[3,[2.9629629629629335,4.385185185185186]],[4,[6.992592592592587,-0.23703703703703383]],[10,[2.251851851851825,2.2518518518518533]],[25,[0.18814026836287212,2.510418336797158]],[23,[-2.2123456790121736,-2.3967078189300537]],[6,[4.5037037037037635,1.1851851851851831]],[21,[0.0,0.0]]],"handle_end":[[4,[-10.311111111111131,-0.5925925925925952]],[16,[6.992592592592587,-2.962962962962962]],[14,[2.844444444444548,0.829629629629629]],[24,[-0.13898543393838736,-1.8545289902200464]],[11,[-6.9925925925927,4.740740740740748]],[1,[-2.1333333333333258,5.68888888888889]],[22,null],[15,[5.214814814814758,1.3037037037037038]],[23,[0.0,0.0]],[12,[-3.0814814814815463,-9.48148148148148]],[10,[-3.318518518518431,0.11851851851851336]],[3,[-6.992592592592587,0.23703703703703383]],[25,[0.0,0.0]],[21,[0.0,0.0]],[18,[3.3185185185185446,1.1851851851851831]],[17,[3.437037037037044,4.148148148148145]],[6,[0.0,0.0]],[7,[10.666666666666629,0.7111111111111086]],[5,[-4.5037037037037635,-1.1851851851851904]],[19,[1.5407407407407163,-8.651851851851855]],[2,[-2.9629629629629335,-4.385185185185186]],[20,[0.0,0.0]],[8,[9.36296296296291,-2.4888888888888943]],[13,[10.90370370370374,2.6074074074074076]],[9,[-2.251851851851825,-2.2518518518518533]],[26,[0.0,0.0]]],"stroke":[[22,0],[10,0],[19,0],[5,0],[9,0],[25,0],[11,0],[18,0],[13,0],[21,0],[24,0],[16,0],[1,0],[26,0],[3,0],[7,0],[20,0],[15,0],[8,0],[6,0],[4,0],[14,0],[12,0],[17,0],[23,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":26}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2422139482859833437,{"inputs":[{"Node":{"node_id":14537754528543289381,"output_index":0,"lambda":false}},{"Node":{"node_id":172538270105470471,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4372998635946271235,{"inputs":[{"Node":{"node_id":13481022631108980683,"output_index":0,"lambda":false}},{"Node":{"node_id":2126710823743005151,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[542361600097372754,{"inputs":[{"Node":{"node_id":17971411534648521628,"output_index":0,"lambda":false}},{"Node":{"node_id":6867142265138950838,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14888395629683671889,{"inputs":[{"Node":{"node_id":17239674500639890523,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[2698266912167150713,{"inputs":[{"Node":{"node_id":3165571685352930240,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[17324767436949538365,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6],"remove":[],"delta":[[3,[158.66666666666669,419.55555555555554]],[6,[289.7777777777778,503.1111111111111]],[4,[150.22222222222223,429.3333333333333]],[1,[503.11111111111114,614.6666666666666]],[2,[362.22222222222223,512.0]],[5,[119.1111111111111,456.44444444444446]]]},"segments":{"add":[1,2,3,4,5,6],"remove":[],"start_point":[[1,1],[6,6],[2,2],[4,4],[3,3],[5,5]],"end_point":[[3,4],[6,1],[5,6],[2,3],[4,5],[1,2]],"handle_primary":[[2,[-52.888888888888914,-48.44444444444446]],[3,[0.0,0.0]],[5,[0.0,0.0]],[1,[0.0,0.0]],[6,[89.85096850895411,61.20347364650138]],[4,[0.0,0.0]]],"handle_end":[[4,[7.1111111111111,-35.55555555555554]],[6,[0.8888888888888005,-0.4444444444444571]],[5,[-89.85096850895414,-61.20347364650138]],[1,[52.888888888888914,48.44444444444446]],[3,[0.0,0.0]],[2,[76.0,-1.7777777777777717]]],"stroke":[[3,0],[1,0],[5,0],[4,0],[2,0],[6,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":6}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[1659518581611333812,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17],"remove":[],"delta":[[7,[773.7942386831274,177.119341563786]],[2,[913.2510288065844,355.55555555555554]],[17,[866.172839506173,375.11111111111114]],[16,[854.5185185185187,346.46913580246917]],[1,[889.8106995884773,368.4609053497942]],[14,[885.9039780521264,331.0617283950617]],[6,[812.2469135802468,182.5185185185185]],[10,[856.2304526748969,234.40329218106996]],[15,[872.9108367626887,333.08093278463645]],[8,[809.349794238683,192.0]],[13,[872.1207133058986,331.2373113854595]],[3,[917.991769547325,333.4320987654321]],[11,[865.1851851851853,248.6255144032922]],[5,[838.3209876543208,205.6954732510288]],[9,[838.4526748971191,213.46502057613168]],[12,[858.1618655692731,310.6063100137174]],[4,[869.1358024691356,247.17695473251027]]]},"segments":{"add":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17],"remove":[],"start_point":[[2,2],[11,11],[3,3],[1,1],[5,5],[9,9],[7,7],[13,13],[14,14],[16,16],[10,10],[12,12],[15,15],[4,4],[6,6],[17,17],[8,8]],"end_point":[[15,16],[1,2],[3,4],[2,3],[5,6],[9,10],[7,8],[10,11],[17,1],[14,15],[16,17],[4,5],[6,7],[12,13],[13,14],[8,9],[11,12]],"handle_primary":[[2,[7.637860082304428,-3.423868312757179]],[7,[6.584362139917744,1.0534979423868265]],[12,[6.935528120713343,13.080932784636502]],[4,[-8.03292181069969,-10.008230452674894]],[1,[9.349794238683105,-4.213991769547306]],[13,[7.111111111111086,-2.72153635116598]],[11,[1.9314128943758533,32.395061728395035]],[6,[-10.930041152263357,-4.213991769547334]],[16,[0.0,0.0]],[8,[14.748971193415628,7.242798353909478]],[14,[-5.267489711934104,0.0]],[9,[6.189300411522595,6.97942386831275]],[3,[-10.72985850116538,-29.20905925317203]],[17,[4.279835390946232,0.32921810699582466]],[15,[-5.267489711934104,1.4924554183813257]],[10,[7.506172839506121,6.452674897119351]],[5,[-6.320987654321016,-8.164609053497912]]],"handle_end":[[3,[8.03292181069969,10.008230452674894]],[8,[-6.189300411522595,-6.97942386831275]],[4,[6.320987654321016,8.164609053497912]],[12,[0.0,0.0]],[11,[0.0,0.0]],[17,[-9.349794238683105,4.213991769547306]],[5,[10.930041152263357,4.213991769547334]],[10,[0.0,0.0]],[2,[7.1111111111111995,19.35802469135808]],[7,[-14.748971193415628,-7.242798353909478]],[9,[-7.506172839506121,-6.452674897119351]],[16,[-8.098765432098958,-2.1728395061728634]],[1,[-7.637860082304542,3.423868312757179]],[13,[0.0,0.0]],[14,[5.267489711934104,-1.4924554183813257]],[6,[0.0,0.0]],[15,[0.0,0.0]]],"stroke":[[10,0],[5,0],[11,0],[2,0],[7,0],[6,0],[4,0],[8,0],[12,0],[3,0],[1,0],[13,0],[16,0],[14,0],[9,0],[17,0],[15,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":17}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4105711298139980122,{"inputs":[{"Node":{"node_id":1162381870526064378,"output_index":0,"lambda":false}},{"Node":{"node_id":1272070255512697108,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10415872992231003638,{"inputs":[{"Node":{"node_id":8375495949882478840,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14817659161913199655,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[3,[726.8148148148148,1023.9999999999998]],[2,[725.3333333333333,985.7777777777776]],[1,[796.148148148148,723.8518518518517]]]},"segments":{"add":[1,2,3],"remove":[],"start_point":[[1,1],[3,3],[2,2]],"end_point":[[1,2],[2,3],[3,1]],"handle_primary":[[3,[0.0,0.0]],[1,[0.0,0.0]],[2,[0.0,0.0]]],"handle_end":[[3,[-75.55555555555566,240.59259259259304]],[2,[0.0,0.0]],[1,[9.777777777777828,-73.18518518518522]]],"stroke":[[3,0],[1,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":3}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7466034304713056391,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[3,[636.4372010299622,153.9035515500083]],[2,[635.5072483424783,152.80078149291265]],[4,[637.4252384335797,135.01742888696126]],[1,[635.2478000597847,135.0597939750059]]]},"segments":{"add":[1,2,3,4],"remove":[],"start_point":[[4,4],[3,3],[2,2],[1,1]],"end_point":[[3,4],[1,2],[2,3],[4,1]],"handle_primary":[[4,[0.0,0.0]],[2,[0.0,0.0]],[3,[1.020097146128478,-12.422679731687992]],[1,[0.0,0.0]]],"handle_end":[[4,[1.1169817316086892,-0.21205734949143107]],[2,[-0.5579820762119425,-0.504231587867622]],[1,[0.4153244360613826,-11.397946559213551]],[3,null]],"stroke":[[4,0],[3,0],[1,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":4}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3636653585682494814,{"inputs":[{"Node":{"node_id":13732749881962071635,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.5},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[172538270105470471,{"inputs":[{"Node":{"node_id":9276497172451351253,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[10928540355449103287,{"inputs":[{"Node":{"node_id":18190631752493248867,"output_index":0,"lambda":false}},{"Node":{"node_id":12554368619682347699,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11632506522064533635,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7],"remove":[],"delta":[[2,[113.33333333333331,859.3333333333333]],[5,[336.66666666666663,799.3333333333334]],[6,[208.0,903.0]],[1,[40.66666666666663,1022.6666666666666]],[7,[145.33333333333331,1022.6666666666666]],[4,[397.3333333333333,770.6666666666666]],[3,[299.33333333333326,775.3333333333333]]]},"segments":{"add":[1,2,3,4,5,6,7],"remove":[],"start_point":[[5,5],[3,3],[2,2],[6,6],[7,7],[4,4],[1,1]],"end_point":[[1,2],[2,3],[3,4],[4,5],[7,1],[5,6],[6,7]],"handle_primary":[[5,[-40.66666666666663,12.0]],[1,[0.0,0.0]],[2,[58.666666666666686,-57.33333333333326]],[7,[0.0,0.0]],[4,[0.0,0.0]],[6,[0.0,0.0]],[3,[65.33333333333337,-6.0]]],"handle_end":[[5,[35.666666666666686,-46.66666666666674]],[3,[0.0,0.0]],[2,[-65.33333333333337,6.0]],[4,[40.66666666666663,-12.0]],[1,[-58.666666666666686,57.333333333333144]],[6,[18.00000000000003,-55.33333333333326]],[7,[0.0,1.3333333333333712]]],"stroke":[[6,0],[7,0],[5,0],[4,0],[2,0],[1,0],[3,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":7}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15498700602024283966,{"inputs":[{"Node":{"node_id":15466714490303763249,"output_index":0,"lambda":false}},{"Node":{"node_id":9847383247226990698,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7505360855062237520,{"inputs":[{"Node":{"node_id":17945736750161448391,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[17819505448204350775,{"inputs":[{"Node":{"node_id":14797986717815207528,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14831840560430171946,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6],"remove":[],"delta":[[4,[893.7613168724276,509.6296296296296]],[2,[831.5555555555555,737.3333333333334]],[3,[889.7777777777777,516.8888888888889]],[1,[791.5555555555555,1026.6666666666663]],[6,[793.7777777777777,1027.2592592592591]],[5,[833.4814814814815,746.3703703703703]]]},"segments":{"add":[1,2,3,4,5,6],"remove":[],"start_point":[[4,4],[6,6],[2,2],[5,5],[3,3],[1,1]],"end_point":[[4,5],[5,6],[6,1],[1,2],[2,3],[3,4]],"handle_primary":[[6,[0.0,0.0]],[1,[0.0,0.0]],[5,[-24.0,92.44444444444446]],[2,[19.555555555555543,-74.66666666666674]],[4,[0.0,0.0]],[3,[0.0,0.0]]],"handle_end":[[5,[0.0,0.0]],[3,[0.0,0.0]],[4,[24.0,-92.44444444444446]],[2,[-22.22222222222217,89.77777777777783]],[6,[-0.14814814814815236,0.29629629629675946]],[1,[-26.4188207246807,100.8718609487812]]],"stroke":[[1,0],[2,0],[5,0],[4,0],[3,0],[6,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":6}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[9470742171134780193,{"inputs":[{"Node":{"node_id":15126865253122550765,"output_index":0,"lambda":false}},{"Node":{"node_id":10270446074640675342,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10795820039540504703,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19],"remove":[],"delta":[[8,[447.7037037037037,131.25925925925924]],[13,[376.7623479921926,0.4130988647245317]],[18,[498.66666666666663,63.70370370370368]],[5,[574.5185185185185,169.18518518518516]],[7,[485.6296296296296,153.48148148148147]],[12,[332.131357712622,16.970215357579164]],[6,[518.2222222222222,175.7037037037037]],[14,[418.0913936876638,12.121582398270874]],[16,[451.9827338808689,43.25925925925927]],[9,[418.074074074074,116.14814814814814]],[11,[350.8679463145693,59.25925925925925]],[17,[478.3481748953775,55.407407407407405]],[2,[591.1111111111111,92.44444444444444]],[10,[396.14814814814815,88.29629629629629]],[1,[569.1851851851852,61.629629629629605]],[19,[540.4444444444445,70.22222222222221]],[15,[432.1308820290171,20.740740740740748]],[4,[604.4444444444445,138.96296296296293]],[3,[590.2222222222222,113.18518518518518]]]},"segments":{"add":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19],"remove":[],"start_point":[[19,19],[6,6],[13,13],[9,9],[18,18],[16,16],[3,3],[14,14],[10,10],[12,12],[7,7],[1,1],[2,2],[15,15],[11,11],[17,17],[4,4],[5,5],[8,8]],"end_point":[[11,12],[2,3],[1,2],[15,16],[14,15],[10,11],[18,19],[17,18],[6,7],[7,8],[5,6],[16,17],[19,1],[4,5],[9,10],[3,4],[8,9],[13,14],[12,13]],"handle_primary":[[14,[0.0,0.0]],[5,[-13.629629629629562,5.925925925925924]],[1,[12.848891737595522,5.11227609582204]],[9,[-13.629629629629562,-7.407407407407419]],[6,[-14.222222222222172,-11.851851851851848]],[3,[-6.518518518518476,13.3333333333333]],[15,[20.148148148148152,6.8148148148148096]],[13,[41.32904569547122,11.708483533546342]],[7,[-15.407407407407447,4.444444444444457]],[4,[18.370370370370324,0.2962962962963047]],[2,[0.0,0.0]],[11,[-11.259259259259125,-10.962962962962962]],[19,[11.555555555555545,-3.851851851851848]],[8,[-9.481481481481524,-12.740740740740762]],[18,[13.333333333333371,4.148148148148152]],[16,[7.703703703703695,6.814814814814817]],[17,[10.962962962963047,12.148148148148124]],[12,[4.019883543587866,-14.744727738229416]],[10,[-13.333333333333371,-8.59259259259261]]],"handle_end":[[6,[15.407407407407334,-4.444444444444457]],[13,null],[18,[-11.555555555555545,3.851851851851848]],[17,[-13.333333333333371,-4.148148148148152]],[19,[-12.030418259761518,-4.786624476892754]],[4,[13.629629629629562,-5.925925925925924]],[14,[-20.14814814814821,-6.814814814814827]],[11,[-2.7704748413796665,10.16196036497552]],[15,[-7.703703703703695,-6.8148148148148096]],[3,[-18.370370370370324,-0.2962962962963047]],[7,[9.481481481481524,12.740740740740762]],[16,[-10.96296296296299,-12.148148148148188]],[10,[11.259259259259238,10.962962962963076]],[5,[14.222222222222172,11.85185185185182]],[8,[13.629629629629562,7.407407407407419]],[9,[13.333333333333371,8.59259259259261]],[1,[-24.88888888888891,-10.666666666666655]],[2,[6.518518518518476,-13.333333333333314]],[12,null]],"stroke":[[10,0],[8,0],[17,0],[12,0],[15,0],[3,0],[18,0],[2,0],[4,0],[1,0],[9,0],[13,0],[5,0],[14,0],[7,0],[11,0],[16,0],[19,0],[6,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":19}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10587073897090054035,{"inputs":[{"Node":{"node_id":8814059393325469059,"output_index":0,"lambda":false}},{"Node":{"node_id":907841922684377912,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[12313564802550122052,{"inputs":[{"Node":{"node_id":13557369662261607646,"output_index":0,"lambda":false}},{"Node":{"node_id":9684857454501250999,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[8413863870096329943,{"inputs":[{"Node":{"node_id":16195626650123806176,"output_index":0,"lambda":false}},{"Node":{"node_id":5302437193964714993,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[1649010831627623835,{"inputs":[{"Node":{"node_id":10599660455959346550,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[9847383247226990698,{"inputs":[{"Node":{"node_id":3627710206997006419,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[8766106989344197438,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6],"remove":[],"delta":[[2,[172.64197530864195,208.98765432098767]],[5,[155.85185185185185,211.55555555555557]],[3,[153.58712172411558,204.8434307274338]],[1,[197.33333333333337,212.5432098765432]],[4,[146.5679012345679,204.44444444444449]],[6,[184.49382716049385,218.2716049382716]]]},"segments":{"add":[1,2,3,4,5,6],"remove":[],"start_point":[[3,3],[1,1],[6,6],[5,5],[2,2],[4,4]],"end_point":[[5,6],[3,4],[4,5],[2,3],[6,1],[1,2]],"handle_primary":[[4,[0.0,0.0]],[6,[3.160493827160479,-0.9876543209876444]],[1,[0.0,0.0]],[3,[-5.834035304362487,0.7861989021958493]],[2,[-7.703703703703667,-1.1851851851851904]],[5,[8.493827160493822,2.3703703703703525]]],"handle_end":[[5,[-3.1604938271605363,0.9876543209877012]],[3,[0.0,0.0]],[6,[-3.160493827160479,1.9753086419753456]],[1,[7.703703703703724,1.1851851851852189]],[4,[-8.493827160493794,-2.370370370370381]],[2,[5.834035304362487,-0.7861989021958493]]],"stroke":[[6,0],[5,0],[3,0],[1,0],[2,0],[4,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":6}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[12473080738469616517,{"inputs":[{"Node":{"node_id":17891208858820401648,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[17133591775058457007,{"inputs":[{"Node":{"node_id":11610326709040542828,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[13163272246010991228,{"inputs":[{"Node":{"node_id":9740500978584792725,"output_index":0,"lambda":false}},{"Node":{"node_id":10253927692147706615,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15286091228862934481,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7],"remove":[],"delta":[[5,[684.554183813443,27.654320987654327]],[4,[665.7229080932784,23.79149519890261]],[7,[637.0589849108368,29.980795610425247]],[3,[638.5953360768175,27.56652949245542]],[2,[627.0946502057614,23.00137174211249]],[6,[661.2894375857338,26.381344307270236]],[1,[623.1001371742112,22.694101508916333]]]},"segments":{"add":[1,2,3,4,5,6,7],"remove":[],"start_point":[[3,3],[1,1],[7,7],[6,6],[2,2],[4,4],[5,5]],"end_point":[[3,4],[5,6],[4,5],[2,3],[1,2],[7,1],[6,7]],"handle_primary":[[1,[0.0,0.0]],[7,[-6.089851956901498,-0.48236451143773706]],[2,[2.150891632373032,1.5802469135802468]],[6,[-11.456790123456813,0.9657064471879302]],[4,[6.672153635116501,-0.35116598079560646]],[3,[5.3991769547326385,0.13168724279836042]],[5,[0.0,0.0]]],"handle_end":[[3,[-6.672153635116501,0.35116598079560646]],[5,[11.456790123456813,-0.9657064471879336]],[7,[2.194787379972581,3.906721536351163]],[2,[-5.486565700800156,-0.13381867562927496]],[4,[-0.9218106995884908,-1.0534979423868336]],[1,[-2.150891632373032,-1.5802469135802468]],[6,[4.433470507544598,0.35116598079561]]],"stroke":[[6,0],[4,0],[2,0],[1,0],[3,0],[5,0],[7,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":7}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3165571685352930240,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[4,[641.1783537148203,135.11412115589184]],[2,[641.3926773385256,156.76403071818197]],[1,[639.0431812985823,135.02706332876082]],[3,[642.0732703685807,156.78028060137643]]]},"segments":{"add":[1,2,3,4],"remove":[],"start_point":[[1,1],[3,3],[4,4],[2,2]],"end_point":[[1,2],[4,1],[3,4],[2,3]],"handle_primary":[[4,[0.0,0.0]],[2,[0.0,0.0]],[1,[0.0,0.0]],[3,[-0.4020858660272779,-10.361367902183218]]],"handle_end":[[3,null],[1,[-0.08991158554488266,-10.211393405397416]],[4,[1.0850699611588652,-0.2123114466060372]],[2,[-0.29793124344723765,0.12588207707705124]]],"stroke":[[2,0],[1,0],[4,0],[3,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":4}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4422453582814483232,{"inputs":[{"Node":{"node_id":4577638792388493935,"output_index":0,"lambda":false}},{"Node":{"node_id":431994205232245356,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13014916927589286309,{"inputs":[{"Node":{"node_id":2044103368441997753,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"u32","alias":null}},"import_index":2}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::PoissonDiskPointsNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15815816861435910950,{"inputs":[{"Node":{"node_id":4105711298139980122,"output_index":0,"lambda":false}},{"Node":{"node_id":17815494794630739611,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15798070933198867970,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7,8,9,10,11,12],"remove":[],"delta":[[10,[508.88888888888886,389.33333333333337]],[8,[350.6666666666667,340.0]],[9,[424.44444444444446,340.0]],[4,[536.0,522.2222222222221]],[2,[642.2222222222222,536.8888888888889]],[6,[438.18064449587104,508.2403828865154]],[12,[660.0,500.66666666666663]],[3,[598.6666666666666,547.1111111111111]],[1,[595.1111111111111,513.3333333333333]],[7,[384.7140020398532,440.0243218219409]],[5,[449.99999999999994,445.3333333333333]],[11,[588.6666666666665,453.3333333333333]]]},"segments":{"add":[1,2,3,4,5,6,7,8,9,10,11,12],"remove":[],"start_point":[[2,2],[7,7],[11,11],[10,10],[4,4],[5,5],[6,6],[12,12],[3,3],[1,1],[9,9],[8,8]],"end_point":[[5,6],[3,4],[11,12],[8,9],[1,2],[9,10],[6,7],[4,5],[2,3],[7,8],[12,1],[10,11]],"handle_primary":[[8,[-46.969945387028645,-26.215783471829923]],[11,[22.666666666666856,18.0]],[10,[25.481481481481467,20.4444444444444]],[6,[0.0,0.0]],[12,[-31.999999999999886,10.666666666666686]],[5,[0.0,0.0]],[2,[0.0,0.0]],[1,[0.0,0.0]],[7,[5.531031978208716,-44.24825582567013]],[3,[-18.370370370370324,2.1728395061728634]],[9,[24.0,8.0]],[4,[-25.28395061728401,-13.827160493827025]]],"handle_end":[[10,[-23.199803616588156,-18.42337346023163]],[2,[18.370370370370324,-2.1728395061728634]],[4,[0.0,0.0]],[3,[25.283950617284063,13.827160493827025]],[11,[-17.185185185185105,5.925925925925867]],[1,[-58.22222222222217,-1.3333333333332575]],[9,[-25.481481481481467,-20.4444444444444]],[12,null],[6,[-4.764895727801786,38.11916582241446]],[7,[28.6666666666668,16.000000000000057]],[8,[-24.0,-8.0]],[5,[0.0,0.0]]],"stroke":[[1,0],[7,0],[6,0],[8,0],[4,0],[9,0],[5,0],[11,0],[2,0],[3,0],[12,0],[10,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":12}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[6672826052605647592,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7,8,9,10,11,12],"remove":[],"delta":[[7,[591.0123456790125,60.40054869684499]],[2,[614.2716726786227,123.52371759047573]],[12,[613.7991159884164,125.99055022100288]],[4,[600.0548696844994,115.53360768175584]],[1,[617.5253772290811,122.03017832647464]],[3,[605.4979423868314,125.19067215363512]],[8,[585.8326474622772,72.60356652949247]],[11,[599.381801554641,127.00502972107913]],[6,[594.172839506173,82.87517146776406]],[9,[593.3827160493829,85.77229080932784]],[10,[599.4403292181071,108.68587105624144]],[5,[603.127572016461,99.64334705075449]]]},"segments":{"add":[1,2,3,4,5,6,7,8,9,10,11,12],"remove":[],"start_point":[[10,10],[9,9],[6,6],[7,7],[1,1],[5,5],[2,2],[3,3],[4,4],[11,11],[12,12],[8,8]],"end_point":[[10,11],[4,5],[12,1],[7,8],[8,9],[1,2],[3,4],[6,7],[2,3],[9,10],[5,6],[11,12]],"handle_primary":[[9,[3.599451303154978,4.477366255144034]],[7,[0.0,0.0]],[3,[-4.594421582076166,-1.1705532693187024]],[4,[0.8779149519890552,-4.477366255144034]],[8,[0.6346981736430735,5.019885555177211]],[5,[-0.8779149519890552,-4.477366255144048]],[6,[-6.145404663923159,-8.076817558299041]],[1,[0.0,0.0]],[12,[2.3801249809480396,-1.7168114616673904]],[2,[-1.2820759681926577,0.7008681959453185]],[11,[3.960543177125487,4.094798878044912]],[10,[-2.575217192501441,8.77914951989024]]],"handle_end":[[1,[1.3006147436874471,-0.7110027265491681]],[3,[-0.8779149519890552,4.477366255144034]],[2,[3.396564570446685,0.8653667695405147]],[8,[-3.599451303154978,-4.477366255144034]],[6,[-6.057613168724288,9.305898491083669]],[12,[0.0,0.0]],[11,[-2.036412917146322,1.4688880058104417]],[5,[6.145404663923159,8.076817558299041]],[7,[-0.9657064471879266,-7.637860082304528]],[4,[0.8779149519890552,4.47736625514402]],[10,[-4.118548609866821,-4.258160427150372]],[9,[3.3684073442221916,-11.48320685530176]]],"stroke":[[1,0],[4,0],[7,0],[9,0],[10,0],[5,0],[11,0],[8,0],[12,0],[6,0],[3,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":12}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7385465194555106679,{"inputs":[{"Node":{"node_id":5009664118231399060,"output_index":0,"lambda":false}},{"Node":{"node_id":6416452251137958677,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[9425359632144678256,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5],"remove":[],"delta":[[1,[610.2608816540582,107.73159867034722]],[5,[606.9918024691358,101.68414814814815]],[4,[612.3749428440786,88.61088248742568]],[2,[615.0086877000457,93.76131687242795]],[3,[622.6042778031804,84.90413046791649]]]},"segments":{"add":[1,2,3,4,5],"remove":[],"start_point":[[2,2],[4,4],[5,5],[1,1],[3,3]],"end_point":[[2,3],[1,2],[4,5],[3,4],[5,1]],"handle_primary":[[3,[-0.6242950769699291,-0.9364426154549648]],[5,[0.0,0.0]],[4,[-3.0889600162577153,2.952395468170536]],[2,[3.21902149062646,-3.511659807956093]],[1,[0.0,0.0]]],"handle_end":[[1,[-3.21902149062646,3.5116598079561214]],[4,[-0.5623782142248501,-6.258066225952547]],[2,[0.15607376924265282,0.7543565513387165]],[5,[-2.1454520955559246,-3.1101486881290583]],[3,[2.992367941940074,-2.86007378029646]]],"stroke":[[4,0],[5,0],[1,0],[2,0],[3,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":5}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15177845878727456758,{"inputs":[{"Node":{"node_id":14225285635863713990,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[5555007473125503522,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7],"remove":[],"delta":[[7,[722.6215515927449,59.58116140832189]],[5,[726.0551745160798,67.30681298582532]],[3,[723.7140679774425,72.106081390032]],[4,[725.0797134583142,72.96448712086573]],[6,[724.0262155159273,62.468526139308025]],[1,[721.7241274196006,63.248894985520494]],[2,[724.7285474775185,66.64349946654472]]]},"segments":{"add":[1,2,3,4,5,6,7],"remove":[],"start_point":[[4,4],[3,3],[7,7],[6,6],[1,1],[2,2],[5,5]],"end_point":[[3,4],[1,2],[4,5],[7,1],[5,6],[2,3],[6,7]],"handle_primary":[[3,[-1.287608596250493,1.7558299039780536]],[5,[-0.585276634659408,-3.8628257887517066]],[6,[-0.03901844231063478,-1.2485901539399509]],[1,[0.0,0.0]],[4,[0.6633135192806776,-0.8584057308337094]],[7,[-1.014479500076277,0.3901844231062413]],[2,[0.546258192348887,2.106995884773667]]],"handle_end":[[3,[-0.6633135192806776,0.8584057308337094]],[6,[1.014479500076277,-0.39018442310623414]],[4,[0.585276634659408,3.8628257887517066]],[2,[1.852405339488314,-2.526007281120613]],[5,[0.03901844231063478,1.2485901539399509]],[7,[0.07803688462126956,-0.03901844231062768]],[1,[-0.501794076076294,-1.9354914362939013]]],"stroke":[[1,0],[3,0],[7,0],[6,0],[4,0],[5,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":7}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[17529660518597229229,{"inputs":[{"Node":{"node_id":3802858053991775169,"output_index":0,"lambda":false}},{"Node":{"node_id":4332145463108161926,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":4.0},"exposed":false}},{"Value":{"tagged_value":{"F64":40.0},"exposed":false}},{"Value":{"tagged_value":{"F64":-30.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[16446146761452576438,{"inputs":[{"Node":{"node_id":12131058586835568367,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"DVec2":[619.1444612416404,54.266956717585614]},"exposed":false}},{"Value":{"tagged_value":{"F64":-0.6118784},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[5.617278800347149,2.5068847538738956]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[1.1858656806102035e-16,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.5,0.5]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3968318310636120842,{"inputs":[{"Node":{"node_id":10127467043900015225,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[454416440369338250,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2],"remove":[],"delta":[[2,[733.7777777777778,518.6666666666666]],[1,[696.0,593.3333333333333]]]},"segments":{"add":[1],"remove":[],"start_point":[[1,1]],"end_point":[[1,2]],"handle_primary":[[1,[0.0,0.0]]],"handle_end":[[1,[-18.666666666666515,26.66666666666663]]],"stroke":[[1,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15038739378867834454,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7],"remove":[],"delta":[[2,[667.4787379972565,58.20576131687244]],[3,[691.5336076817558,52.14814814814816]],[7,[662.3868312757203,59.61042524005489]],[4,[704.965706447188,54.25514403292181]],[5,[704.6145404663924,55.39643347050756]],[1,[654.3978052126201,51.621399176954746]],[6,[687.4951989026064,54.518518518518526]]]},"segments":{"add":[1,2,3,4,5,6,7],"remove":[],"start_point":[[1,1],[4,4],[6,6],[5,5],[7,7],[3,3],[2,2]],"end_point":[[6,7],[5,6],[7,1],[3,4],[2,3],[4,5],[1,2]],"handle_primary":[[5,[0.0,0.0]],[3,[7.723134415788309,-0.2640387834457485]],[2,[6.145404663923159,-1.0534979423868336]],[1,[0.0,0.0]],[4,[0.0,0.0]],[7,[-4.546573253919632,-2.2347563451469625]],[6,[-10.156808190486911,1.6663513437517778]]],"handle_end":[[5,[11.237311385459408,-1.8436213991769537]],[6,[5.179698216735233,2.5459533607681664]],[4,[0.0,0.0]],[7,[0.0,0.08779149519890694]],[1,[-5.875074923313605,1.0071557011394745]],[2,[-10.271604938271594,0.35116598079560646]],[3,null]],"stroke":[[2,0],[5,0],[3,0],[6,0],[4,0],[7,0],[1,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":7}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13529118918690401241,{"inputs":[{"Node":{"node_id":3649809135741361946,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4493274523708782092,{"inputs":[{"Node":{"node_id":15239301303367148581,"output_index":0,"lambda":false}},{"Node":{"node_id":12880230498984021417,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14982414026754548178,{"inputs":[{"Node":{"node_id":13045580349734858212,"output_index":0,"lambda":false}},{"Node":{"node_id":4332145463108161926,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":10.0},"exposed":false}},{"Value":{"tagged_value":{"F64":-25.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[6973438081601736688,{"inputs":[{"Node":{"node_id":11630078441485655672,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[12131058586835568367,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[2,[1.0389965338526328,0.5311836299154763]],[1,[0.6081211287919952,-0.2081641356766983]],[4,[0.022131022857413415,0.4190687668825941]],[3,[0.443655685420585,0.8388279058567918]]]},"segments":{"add":[1,2,3,4],"remove":[],"start_point":[[3,3],[2,2],[1,1],[4,4]],"end_point":[[4,1],[3,4],[2,3],[1,2]],"handle_primary":[[2,[-0.06483434986356718,0.26682960488486684]],[1,[0.297407817404018,0.05174926937677715]],[3,[-0.29501938196342326,-0.04735956037402645]],[4,[0.021131345375600137,-0.27179882337964756]]],"handle_end":[[4,[-0.38805268271111915,-0.0675215701634326]],[3,[-0.02113134537560013,0.27179882337964756]],[1,[0.07365905854782184,-0.30314821587423946]],[2,[0.2950193819634199,0.04735956037402589]]],"stroke":[[1,0],[3,0],[4,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":4}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4577638792388493935,{"inputs":[{"Node":{"node_id":3170924135668664007,"output_index":0,"lambda":false}},{"Node":{"node_id":6292009934909381201,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11659756061767599421,{"inputs":[{"Node":{"node_id":8766106989344197438,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[1157261387411722141,{"inputs":[{"Node":{"node_id":4577174813962563383,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[5140869461760168364,{"inputs":[{"Node":{"node_id":17118107476414252025,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[8543051864256131356,{"inputs":[{"Node":{"node_id":5002654561220917457,"output_index":0,"lambda":false}},{"Node":{"node_id":4332145463108161926,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":300.0},"exposed":false}},{"Value":{"tagged_value":{"F64":-100.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[5185036609290210853,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29],"remove":[],"delta":[[8,[709.8600823045268,50.83127572016461]],[1,[687.846364883402,65.58024691358025]],[16,[713.7448559670781,60.37860082304528]],[3,[703.7366255144034,54.694101508916326]],[15,[703.604938271605,68.21399176954733]],[21,[716.1444901691814,49.82655083066605]],[27,[718.680688919372,68.71147690900777]],[7,[701.785703398872,67.26779454351473]],[26,[722.5825331504344,57.31809175430575]],[2,[697.9423868312758,64.79012345679013]],[5,[705.102270995275,59.269013869836904]],[28,[702.2539247065995,73.00350556317633]],[18,[716.7736625514402,54.9135802469136]],[9,[702.2222222222223,38.38683127572017]],[23,[711.5061728395062,69.99176954732509]],[12,[698.2935528120714,34.35573845450388]],[11,[697.7283950617284,31.30864197530864]],[4,[704.9657064471878,54.25514403292179]],[20,[716.6907483615302,62.66361835086114]],[10,[696.5925925925927,33.728395061728385]],[22,[719.6171315348269,59.659198292943145]],[14,[711.9695168419447,48.57796067672611]],[29,[694.0600518213687,74.40816948635879]],[6,[695.152568206066,67.34583142813594]],[13,[706.9556470050298,39.272062185642426]],[25,[719.8512421886905,54.19661636945587]],[24,[719.0123456790122,66.6337448559671]],[17,[713.3351623228167,47.46593507087334]],[19,[705.9094650205762,70.25514403292182]]]},"segments":{"add":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29],"remove":[],"start_point":[[15,15],[9,9],[22,22],[17,17],[14,14],[28,28],[3,3],[1,1],[4,4],[13,13],[20,20],[21,21],[24,24],[16,16],[11,11],[7,7],[23,23],[10,10],[8,8],[25,25],[18,18],[2,2],[5,5],[19,19],[27,27],[6,6],[12,12],[29,29],[26,26]],"end_point":[[12,13],[26,27],[27,28],[21,22],[29,1],[3,4],[4,5],[13,14],[20,21],[25,26],[23,24],[16,17],[10,11],[18,19],[24,25],[7,8],[22,23],[2,3],[28,29],[8,9],[11,12],[6,7],[5,6],[14,15],[9,10],[15,16],[1,2],[17,18],[19,20]],"handle_primary":[[21,[0.0,0.0]],[16,[2.9207548934437,-5.774876595401999]],[7,[3.3946044810244302,-1.8728852309099435]],[8,[1.1368683772161605e-13,-7.4135040390184415]],[1,[0.0,0.0]],[4,[0.0,0.0]],[20,[2.536198750190465,-6.516079865874104]],[23,[0.0,0.0]],[14,[0.9193720469440904,5.347965249199831]],[12,[1.5089163237310004,2.3850022862368547]],[13,[2.1939750755697105,1.3128956217623369]],[3,[0.0,0.0]],[10,[-0.04481007342064913,-1.8372595419893116]],[15,[0.0,0.0]],[19,[0.0,0.0]],[28,[-7.920532726374063,-0.13055823175342596]],[24,[2.106995884773596,-3.0044200579180256]],[29,[0.0,0.0]],[11,[0.0,0.0]],[27,[-4.128769232802142,3.294230770852593]],[25,[0.0,0.0]],[5,[-1.1705532693187024,3.0044200579180043]],[26,[0.8664211612748431,3.3573819999397045]],[6,[0.0,0.0]],[17,[0.0,0.0]],[9,[-3.823807346440958,-1.6387745770461848]],[18,[-0.7242798353908029,5.860082304526735]],[22,[-1.7948483462886315,6.047858558146615]],[2,[1.5646505637769224,-1.2302214356413188]]],"handle_end":[[18,[9.169333942996444,-4.409083981100437]],[1,[-2.555707971345896,2.0094497789970944]],[21,[1.7948483462886315,-6.047858558146615]],[29,[0.009754610577488164,0.048773052888265056]],[20,[1.638774577046206,1.5607376924249363]],[12,[-3.679926840420876,-2.202103337905797]],[24,[2.980033531474078,4.338363054412447]],[2,[0.5267489711934559,6.320987654320987]],[25,[-0.6242950769700428,-2.419143423258646]],[10,[0.0,0.0]],[22,[2.731290961743639,-1.326627038561199]],[13,[-0.7923207898123792,-4.608911119518574]],[27,[7.101356500533598,0.11705532693187592]],[11,[-0.8654907204776237,-1.3679998781853442]],[17,[0.667740598959881,-5.402628482494777]],[19,[-2.536198750190465,6.516079865874104]],[15,[-3.84819387288519,7.608596250571544]],[3,[0.0,0.0]],[7,[-1.1368683772161605e-13,8.389895136005812]],[5,[6.516079865874076,-2.4581618655692807]],[9,[0.04481007342064913,1.837259541989333]],[16,[1.1705532693187024,1.8728852309099224]],[23,[-2.1028230213785264,2.9984698638176326]],[26,[3.66773357719876,-2.926383173296756]],[6,[-3.208476806721251,1.7701941002599142]],[4,[1.1705532693187024,-3.0044200579180043]],[28,[0.0,0.0]],[14,[7.30864197530866,-5.333333333333336]],[8,[5.150019007352512,2.2071510031511608]]],"stroke":[[16,0],[18,0],[14,0],[15,0],[24,0],[21,0],[26,0],[5,0],[17,0],[12,0],[23,0],[1,0],[27,0],[13,0],[25,0],[20,0],[22,0],[10,0],[29,0],[4,0],[19,0],[28,0],[9,0],[7,0],[8,0],[11,0],[2,0],[6,0],[3,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":29}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[18190631752493248867,{"inputs":[{"Node":{"node_id":12428327489525325219,"output_index":0,"lambda":false}},{"Node":{"node_id":10375238420217738812,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11022999329156494369,{"inputs":[{"Node":{"node_id":454416440369338250,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[5020096817747898028,{"inputs":[{"Node":{"node_id":15286091228862934481,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[2641530639940889619,{"inputs":[{"Node":{"node_id":5174744389209053970,"output_index":0,"lambda":false}},{"Node":{"node_id":14539627480594383748,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[5326536612985524219,{"inputs":[{"Node":{"node_id":15798070933198867970,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":27.0},"exposed":false}},{"Value":{"tagged_value":{"U32":9},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"u32","alias":null}},"import_index":2}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::PoissonDiskPointsNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11666664915283969027,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2],"remove":[],"delta":[[1,[802.3703703703703,580.9382716049382]],[2,[751.4074074074075,685.0370370370371]]]},"segments":{"add":[1,2],"remove":[],"start_point":[[2,2],[1,1]],"end_point":[[1,2],[2,1]],"handle_primary":[[1,[0.0,0.0]],[2,[20.740740740740534,-42.469135802469054]]],"handle_end":[[2,null],[1,[27.259259259259125,-48.79012345678995]]],"stroke":[[1,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":2}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3414873131936208778,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2],"remove":[],"delta":[[1,[761.7777777777777,737.3333333333333]],[2,[697.7777777777777,954.2222222222222]]]},"segments":{"add":[1,2],"remove":[],"start_point":[[1,1],[2,2]],"end_point":[[1,2],[2,1]],"handle_primary":[[2,[0.0,0.0]],[1,[0.0,0.0]]],"handle_end":[[1,[26.22222222222217,-158.66666666666652]],[2,[-40.0,81.33333333333326]]],"stroke":[[1,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":2}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16805628435335819723,{"inputs":[{"Node":{"node_id":10689298484366290551,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[13557369662261607646,{"inputs":[{"Node":{"node_id":3535178979443201645,"output_index":0,"lambda":false}},{"Node":{"node_id":15177845878727456758,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16339345235172368839,{"inputs":[{"Node":{"node_id":14778750092903591172,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[18214377096178867498,{"inputs":[{"Node":{"node_id":7747398671834040298,"output_index":0,"lambda":false}},{"Node":{"node_id":4332145463108161926,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":300.0},"exposed":false}},{"Value":{"tagged_value":{"F64":-100.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[10919570333355604326,{"inputs":[{"Node":{"node_id":4859656512650360562,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3955326429435439190,{"inputs":[{"Node":{"node_id":13128371516143508372,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[2126710823743005151,{"inputs":[{"Node":{"node_id":14831840560430171946,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[11804065810513502701,{"inputs":[{"Node":{"node_id":9782123335421401489,"output_index":0,"lambda":false}},{"Node":{"node_id":17133591775058457007,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7320676248579211727,{"inputs":[{"Node":{"node_id":14817659161913199655,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[7654665057468818389,{"inputs":[{"Node":{"node_id":17378885078543074499,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[10514847656270897393,{"inputs":[{"Value":{"tagged_value":{"GraphicGroup":{"instance":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":16339345235172368839,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16434255153991868080,{"inputs":[{"Node":{"node_id":14356371986281920306,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[14356371986281920306,{"inputs":[{"Node":{"node_id":10420981328998103391,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[17207349373429328029,{"inputs":[{"Node":{"node_id":17967471489196302183,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[6867142265138950838,{"inputs":[{"Node":{"node_id":4784708315242877950,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14862049226133442027,{"inputs":[{"Node":{"node_id":16614450796751955858,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[8814059393325469059,{"inputs":[{"Node":{"node_id":15492651270767932214,"output_index":0,"lambda":false}},{"Node":{"node_id":14035980686649077716,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[17364155187784942740,{"inputs":[{"Node":{"node_id":1378578509112405,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.9019608,"green":0.8,"blue":0.6117647,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.9019608,"green":0.8,"blue":0.6117647,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[10586744777717861556,{"inputs":[{"Node":{"node_id":2368785048463929131,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[15656854169166220905,{"inputs":[{"Node":{"node_id":7821977654068146599,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"DVec2":[-5.0,22.0]},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[1.0,1.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.5,0.5]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[5609799566275475322,{"inputs":[{"Node":{"node_id":13302269488061286120,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10190227675276560561,{"inputs":[{"Node":{"node_id":2682920349304670808,"output_index":0,"lambda":false}},{"Node":{"node_id":16434255153991868080,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4909350123806022131,{"inputs":[{"Node":{"node_id":15498700602024283966,"output_index":0,"lambda":false}},{"Node":{"node_id":16536768589601337644,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10424806499648491677,{"inputs":[{"Value":{"tagged_value":{"GraphicGroup":{"instance":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":17147975601187022720,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14598755603287563819,{"inputs":[{"Node":{"node_id":7466034304713056391,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[8230694129617719636,{"inputs":[{"Node":{"node_id":4909350123806022131,"output_index":0,"lambda":false}},{"Node":{"node_id":16805628435335819723,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16175421708184657649,{"inputs":[{"Node":{"node_id":8698602280607307123,"output_index":0,"lambda":false}},{"Node":{"node_id":514796034658094296,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[18422317423856403288,{"inputs":[{"Node":{"node_id":10133176481349663495,"output_index":0,"lambda":false}},{"Node":{"node_id":12594527670567285670,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15395954548128560685,{"inputs":[{"Node":{"node_id":13475705179546695973,"output_index":0,"lambda":false}},{"Node":{"node_id":16767482995096345179,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11464423670065789907,{"inputs":[{"Node":{"node_id":1649010831627623835,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[5269304445610080925,{"inputs":[{"Node":{"node_id":10919570333355604326,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[14012583111791538162,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[1,[248.00000000000009,884.0]],[2,[380.00000000000006,806.0]],[3,[603.3333333333335,744.6666666666666]]]},"segments":{"add":[1,2],"remove":[],"start_point":[[1,1],[2,2]],"end_point":[[2,3],[1,2]],"handle_primary":[[2,[70.80694036316174,-19.49756328840681]],[1,[0.0,0.0]]],"handle_end":[[2,[-71.33333333333326,24.0]],[1,[-92.00000000000006,25.333333333333258]]],"stroke":[[2,0],[1,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4784708315242877950,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7],"remove":[],"delta":[[2,[808.5333333333333,683.1555555555556]],[7,[807.0666666666666,680.1333333333332]],[6,[592.0,845.3333333333333]],[4,[468.14814814814815,1025.382716049383]],[1,[902.6666666666669,446.66666666666674]],[3,[592.4000000000001,852.3999999999999]],[5,[464.5925925925926,1025.382716049383]]]},"segments":{"add":[1,2,3,4,5,6,7],"remove":[],"start_point":[[2,2],[4,4],[1,1],[3,3],[7,7],[6,6],[5,5]],"end_point":[[4,5],[7,1],[5,6],[2,3],[6,7],[1,2],[3,4]],"handle_primary":[[5,[0.0,0.0]],[1,[0.0,0.0]],[3,[-91.33798434535026,86.27035509501377]],[6,[93.94069526511169,-85.35957406301043]],[2,[-81.33333333333337,100.88888888888891]],[4,[0.0,0.0]],[7,[62.39957279246403,-72.271586423759]]],"handle_end":[[6,[-87.55555555555577,101.4074074074075]],[2,[85.857044886376,-81.09351003138556]],[7,[-3.466666666666697,51.33333333333326]],[1,[97.81027061870486,-121.32749415544254]],[3,[0.0,0.0]],[5,[-102.71604938271612,93.3333333333336]],[4,[0.0,0.0]]],"stroke":[[6,0],[7,0],[1,0],[3,0],[4,0],[2,0],[5,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":7}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[8375495949882478840,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7,8,9,10,11],"remove":[],"delta":[[1,[616.0751917898693,61.31097901742621]],[10,[650.9056546258192,56.62876594015139]],[2,[617.4278311233043,51.042625616013815]],[6,[662.1234567901236,64.96570644718793]],[5,[650.6227709190673,52.93827160493828]],[8,[675.3580246913581,68.74074074074075]],[4,[642.6077325610934,47.29035208047554]],[7,[673.0096021947875,65.84362139917695]],[3,[628.5871056241429,46.71808159325306]],[11,[641.3168724279836,48.02194787379973]],[9,[662.1234567901236,66.9849108367627]]]},"segments":{"add":[1,2,3,4,5,6,7,8,9,10,11],"remove":[],"start_point":[[4,4],[1,1],[9,9],[8,8],[3,3],[7,7],[10,10],[11,11],[2,2],[6,6],[5,5]],"end_point":[[2,3],[6,7],[11,1],[8,9],[7,8],[1,2],[4,5],[3,4],[10,11],[5,6],[9,10]],"handle_primary":[[8,[0.0,0.0]],[11,[-8.252400548696869,-0.8779149519890339]],[1,[-0.7315957933242316,0.01300614743686168]],[4,[2.784561671457709,0.5265657466421629]],[6,[5.4430727023319605,2.545953360768181]],[3,[4.873654303444027,-0.3091793289098348]],[9,[-4.389574759945162,-2.106995884773667]],[5,[3.160493827160508,4.6529492455418335]],[10,[-2.0025980353477735,-3.5689865976493422]],[2,[2.1833209230284183,-3.0691100638496778]],[7,[0.0,0.0]]],"handle_end":[[8,[4.389574759945162,2.106995884773667]],[7,[0.0,0.0]],[1,[-2.4595700304455477,3.4574354386312436]],[5,[-5.4430727023319605,-2.545953360768181]],[10,[6.086554705109506,0.6475058196925048]],[4,[-3.160493827160508,-4.6529492455418335]],[6,[0.0,0.0]],[3,[-2.7845616714574817,-0.5265657466421203]],[2,[-5.145487535686698,0.32642413354457744]],[9,[2.6272417822486887,4.682213077274824]],[11,[2.0257074632933154,-0.6893258141543512]]],"stroke":[[5,0],[10,0],[1,0],[7,0],[9,0],[8,0],[2,0],[11,0],[6,0],[3,0],[4,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":11}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11677503666435782605,{"inputs":[{"Node":{"node_id":12049041947382267086,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[16536768589601337644,{"inputs":[{"Node":{"node_id":4222034829755771252,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[2087303479944421366,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[1,[365.6296296296296,1025.4814814814813]],[3,[368.59259259259255,1025.1851851851852]],[2,[443.2592592592592,882.0740740740739]]]},"segments":{"add":[1,2],"remove":[],"start_point":[[1,1],[2,2]],"end_point":[[1,2],[2,3]],"handle_primary":[[2,[0.0,0.0]],[1,[0.0,0.0]]],"handle_end":[[1,[-48.59259259259255,50.07407407407413]],[2,[31.111111111111143,-96.29629629629642]]],"stroke":[[2,0],[1,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[17426609415699324395,{"inputs":[{"Node":{"node_id":15896921950407486754,"output_index":0,"lambda":false}},{"Node":{"node_id":11464423670065789907,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16450742929146919960,{"inputs":[{"Node":{"node_id":14887821801874852671,"output_index":0,"lambda":false}},{"Node":{"node_id":11899713172487274471,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[8595304668947966919,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2],"remove":[],"delta":[[1,[810.1333333333333,731.4666666666668]],[2,[798.4000000000001,879.4666666666668]]]},"segments":{"add":[1,2],"remove":[],"start_point":[[2,2],[1,1]],"end_point":[[1,2],[2,1]],"handle_primary":[[2,[0.0,0.0]],[1,[0.0,0.0]]],"handle_end":[[2,[-18.13333333333333,82.66666666666674]],[1,[-1.8666666666665608,-67.46666666666658]]],"stroke":[[1,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":2}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11451028343967836482,{"inputs":[{"Node":{"node_id":2422139482859833437,"output_index":0,"lambda":false}},{"Node":{"node_id":12531351117929704587,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[314278016428495768,{"inputs":[{"Node":{"node_id":6282972142629473139,"output_index":0,"lambda":false}},{"Node":{"node_id":5020096817747898028,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[17971411534648521628,{"inputs":[{"Value":{"tagged_value":{"GraphicGroup":{"instance":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":14862049226133442027,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13014628586360765651,{"inputs":[{"Value":{"tagged_value":{"GraphicGroup":{"instance":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":2175432926627256613,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14778750092903591172,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[1,[155.98219408731924,204.757705978404]],[2,[149.0793650793651,202.5537918871252]],[3,[146.5679012345679,204.44444444444449]]]},"segments":{"add":[1,2,3],"remove":[],"start_point":[[3,3],[2,2],[1,1]],"end_point":[[1,2],[2,3],[3,1]],"handle_primary":[[2,[-2.2695727277346123,-0.643804298125275]],[1,[-2.6135873853791907,-0.8494167367814498]],[3,[0.9278738161427498,1.2447087777524644]]],"handle_end":[[2,[-1.156966490299823,-1.5520282186949146]],[3,[-0.32172621516085087,3.1233079488176827]],[1,[1.7022700834823468,0.48287890620272833]]],"stroke":[[1,0],[2,0],[3,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":3}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[18015048324114736039,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29],"remove":[],"delta":[[2,[683.0617283950618,104.2962962962963]],[22,[785.9753086419753,197.13580246913585]],[23,[760.8888888888889,175.80246913580248]],[17,[757.7283950617285,217.48148148148147]],[8,[613.3333333333334,44.24691358024691]],[27,[722.1728395061729,147.1604938271605]],[11,[596.9382716049383,85.13580246913581]],[15,[664.8888888888889,140.64197530864195]],[7,[607.2098765432099,55.308641975308646]],[20,[805.1358024691358,260.34567901234567]],[1,[687.4074074074074,99.1604938271605]],[19,[797.8271604938273,246.1234567901235]],[4,[654.4197530864197,54.91358024691358]],[6,[617.283950617284,44.641975308641975]],[3,[675.3580246913581,68.74074074074075]],[5,[639.8024691358025,44.24691358024691]],[28,[730.2716049382716,169.4814814814815]],[18,[799.2098765432099,253.23456790123456]],[25,[737.7777777777778,170.07407407407408]],[16,[672.5925925925926,176.5925925925926]],[29,[705.1851851851852,106.27160493827162]],[21,[805.925925925926,230.9135802469136]],[10,[597.530864197531,73.08641975308642]],[26,[752.1975308641976,172.83950617283952]],[24,[746.8641975308642,175.40740740740742]],[9,[609.3827160493827,43.65432098765433]],[12,[603.4567901234568,92.8395061728395]],[14,[630.716049382716,132.3456790123457]],[13,[616.2962962962963,115.16049382716052]]]},"segments":{"add":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29],"remove":[],"start_point":[[3,3],[4,4],[19,19],[10,10],[12,12],[26,26],[2,2],[11,11],[6,6],[21,21],[5,5],[24,24],[29,29],[25,25],[28,28],[18,18],[9,9],[23,23],[14,14],[8,8],[15,15],[1,1],[7,7],[20,20],[27,27],[17,17],[22,22],[13,13],[16,16]],"end_point":[[26,27],[11,12],[5,6],[15,16],[20,21],[28,29],[24,25],[18,19],[8,9],[13,14],[17,18],[3,4],[10,11],[2,3],[1,2],[19,20],[12,13],[9,10],[7,8],[21,22],[16,17],[23,24],[4,5],[14,15],[29,1],[22,23],[27,28],[25,26],[6,7]],"handle_primary":[[28,[0.0,0.0]],[12,[5.728395061728406,16.98765432098766]],[7,[-0.9876543209876444,-4.740740740740733]],[18,[0.0,-2.172839506172835]],[25,[0.0,0.0]],[3,[-15.209876543209816,-1.7777777777777717]],[15,[6.913580246913625,9.87654320987656]],[1,[-2.1728395061728634,1.5802469135802255]],[4,[-2.3703703703704377,-3.555555555555557]],[24,[-5.3333333333332575,-2.5679012345678984]],[10,[-6.320987654320902,4.740740740740733]],[20,[0.0,0.0]],[19,[4.543209876543187,5.925925925925952]],[14,[5.728395061728293,2.370370370370381]],[26,[0.0,0.0]],[9,[-14.024691358024713,15.802469135802482]],[5,[-9.48148148148141,0.9876543209876516]],[11,[3.3580246913580822,1.9753086419753176]],[13,[2.370370370370324,7.308641975308632]],[8,[-1.1851851851851052,-1.1851851851851904]],[16,[29.23456790123464,10.666666666666686]],[27,[0.0,0.0]],[6,[-8.09876543209873,4.740740740740733]],[21,[-2.5679012345678984,-9.481481481481469]],[17,[20.594048174910657,8.937919170354007]],[2,[-8.120713305898448,-14.573388203017842]],[22,[-7.506172839506121,-7.901234567901298]],[29,[-13.234567901234527,-3.3580246913580396]],[23,[-2.5679012345678984,-0.592592592592581]]],"handle_end":[[24,[0.0,0.0]],[19,[0.0,0.0]],[15,[0.0,0.0]],[26,[19.35802469135808,26.864197530864203]],[29,[0.0,0.0]],[25,[-4.740740740740762,0.790123456790127]],[13,[-5.728395061728293,-2.370370370370381]],[18,[0.0,0.0]],[11,[0.0,0.0]],[14,[-6.913580246913625,-9.876543209876502]],[9,[0.0,0.0]],[23,[5.3333333333332575,2.5679012345678984]],[28,[17.580246913580254,58.07407407407402]],[20,[2.5679012345678984,9.481481481481438]],[16,[-20.59404817491054,-8.937919170353979]],[10,[-3.3580246913580822,-1.9753086419753176]],[27,[-3.7530864197531177,-7.506172839506178]],[17,[0.0,0.0]],[5,[0.0,0.0]],[6,[0.0,0.0]],[1,[0.0,0.0]],[2,[0.0,0.0]],[21,[7.506172839506121,7.901234567901213]],[3,[2.3703703703704377,3.555555555555557]],[8,[0.0,0.0]],[12,[0.0,0.0]],[22,[2.5679012345678984,0.592592592592581]],[7,[0.0,0.0]],[4,[9.48148148148141,-0.9876543209876444]]],"stroke":[[21,0],[6,0],[9,0],[7,0],[2,0],[23,0],[22,0],[16,0],[20,0],[3,0],[27,0],[5,0],[14,0],[10,0],[4,0],[15,0],[12,0],[18,0],[13,0],[25,0],[1,0],[29,0],[11,0],[19,0],[8,0],[17,0],[26,0],[24,0],[28,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":29}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13975451746581400000,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2],"remove":[],"delta":[[2,[901.6,572.8]],[1,[835.7333333333332,786.4000000000001]]]},"segments":{"add":[1,2],"remove":[],"start_point":[[1,1],[2,2]],"end_point":[[1,2],[2,1]],"handle_primary":[[2,[0.0,0.0]],[1,[0.0,0.0]]],"handle_end":[[2,[47.4666666666667,-108.26666666666664]],[1,[-22.399999999999977,109.06666666666648]]],"stroke":[[2,0],[1,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":2}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13035777574951374461,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[2,[833.7777777777778,573.3333333333333]],[1,[896.0,440.44444444444446]],[3,[696.8888888888889,697.3333333333333]]]},"segments":{"add":[1,2],"remove":[],"start_point":[[1,1],[2,2]],"end_point":[[2,3],[1,2]],"handle_primary":[[2,[-68.0,92.88888888888891]],[1,[0.0,0.0]]],"handle_end":[[2,[0.0,0.0]],[1,[68.0,-92.88888888888891]]],"stroke":[[2,0],[1,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10336592647221792772,{"inputs":[{"Node":{"node_id":16051539163551573193,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[3535178979443201645,{"inputs":[{"Node":{"node_id":12838133055063962839,"output_index":0,"lambda":false}},{"Node":{"node_id":8240895922641772563,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14675232891471617236,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[2,[480.7407407407408,1026.6666666666663]],[3,[483.9506172839506,1026.7654320987656]],[1,[652.8888888888889,822.6666666666666]]]},"segments":{"add":[1,2,3],"remove":[],"start_point":[[2,2],[3,3],[1,1]],"end_point":[[1,2],[3,1],[2,3]],"handle_primary":[[1,[0.0,0.0]],[2,[0.0,0.0]],[3,[0.0,0.0]]],"handle_end":[[3,[-143.85185185185185,150.07407407407413]],[1,[26.66666666666669,-58.666666666666515]],[2,[0.0,0.0]]],"stroke":[[3,0],[1,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":3}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14035980686649077716,{"inputs":[{"Node":{"node_id":6666260895482068061,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[421715625023770179,{"inputs":[{"Node":{"node_id":3670529450440935325,"output_index":0,"lambda":false}},{"Node":{"node_id":3150436463719911922,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2044103368441997753,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7,8],"remove":[],"delta":[[4,[796.4444444444446,278.12345679012356]],[1,[710.5185185185186,302.2222222222223]],[2,[723.3580246913581,337.97530864197535]],[3,[747.6543209876543,394.6666666666667]],[7,[710.7160493827162,200.09876543209884]],[5,[793.6790123456792,258.7654320987655]],[8,[694.5185185185187,204.8395061728396]],[6,[756.7407407407409,223.40740740740748]]]},"segments":{"add":[1,2,3,4,5,6,7,8],"remove":[],"start_point":[[5,5],[8,8],[2,2],[3,3],[6,6],[7,7],[4,4],[1,1]],"end_point":[[7,8],[5,6],[2,3],[3,4],[6,7],[4,5],[8,1],[1,2]],"handle_primary":[[6,[-22.518518518518476,-12.641975308641976]],[4,[0.0,0.0]],[3,[0.0,0.0]],[8,[0.0,0.0]],[1,[0.0,0.0]],[2,[0.0,0.0]],[5,[-5.135802469135797,-10.271604938271594]],[7,[0.0,0.0]]],"handle_end":[[1,[1.3827160493826796,-12.641975308641976]],[5,[22.518518518518476,12.641975308641976]],[4,[5.135802469135797,10.271604938271594]],[8,[7.111111111110972,-82.76543209876547]],[6,[0.0,0.0]],[2,[-10.864197530864203,-35.5555555555556]],[3,[-12.049382716049422,68.54320987654324]],[7,[8.117474523314513,-0.7895812719984008]]],"stroke":[[7,0],[3,0],[2,0],[1,0],[4,0],[6,0],[5,0],[8,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":8}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[6749771744300551215,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5],"remove":[],"delta":[[3,[726.6666666666666,765.3333333333333]],[4,[620.8888888888888,943.5555555555557]],[1,[589.3333333333333,1025.3333333333333]],[2,[660.4444444444443,878.2222222222222]],[5,[585.3333333333333,1025.7777777777778]]]},"segments":{"add":[1,2,3,4,5],"remove":[],"start_point":[[1,1],[2,2],[3,3],[5,5],[4,4]],"end_point":[[1,2],[3,4],[5,1],[4,5],[2,3]],"handle_primary":[[2,[31.11111111111109,-50.66666666666663]],[4,[-29.333333333333258,59.11111111111097]],[5,[0.0,0.0]],[1,[0.0,0.0]],[3,[0.0,0.0]]],"handle_end":[[2,[0.0,0.0]],[3,[29.333333333333258,-59.1111111111112]],[1,[-31.863450886870623,51.89190573004646]],[5,[-0.4444444444443434,0.8888888888889142]],[4,[0.0,0.0]]],"stroke":[[3,0],[1,0],[5,0],[2,0],[4,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":5}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2440895173483452224,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[1,[93.037037037037,526.8148148148147]],[3,[33.18518518518515,636.148148148148]],[2,[30.814814814814767,578.0740740740739]]]},"segments":{"add":[1,2],"remove":[],"start_point":[[2,2],[1,1]],"end_point":[[2,3],[1,2]],"handle_primary":[[1,[0.0,0.0]],[2,[-9.185185185185162,39.703703703703695]]],"handle_end":[[1,[9.185185185185162,-39.703703703703695]],[2,[0.0,0.0]]],"stroke":[[2,0],[1,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11356586238302409958,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6],"remove":[],"delta":[[2,[783.1111111111111,348.74074074074065]],[6,[792.2962962962963,188.74074074074073]],[5,[811.8518518518518,273.18518518518516]],[1,[811.5555555555555,250.96296296296296]],[3,[732.148148148148,432.2962962962963]],[4,[777.7777777777778,375.7037037037037]]]},"segments":{"add":[1,2,3,4,5],"remove":[],"start_point":[[4,4],[5,5],[2,2],[1,1],[3,3]],"end_point":[[4,5],[3,4],[5,6],[1,2],[2,3]],"handle_primary":[[1,[0.0,0.0]],[3,[0.0,0.0]],[4,[10.310300340717504,-19.181954122264813]],[2,[-14.6604291210798,34.80924611318039]],[5,[3.7834358363461433,-27.565032521950258]]],"handle_end":[[1,[14.6604291210798,-34.809246113180336]],[3,[-12.740740740740875,23.703703703703695]],[2,[26.666666666666515,-35.555555555555486]],[5,[26.074074074074133,33.18518518518516]],[4,[-4.148148148148152,30.22222222222223]]],"stroke":[[1,0],[2,0],[3,0],[4,0],[5,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13231685386999438557,{"inputs":[{"Node":{"node_id":1659518581611333812,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[9371909264427723282,{"inputs":[{"Node":{"node_id":8595304668947966919,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.84705883,"green":0.5372549,"blue":0.38431373,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.84705883,"green":0.5372549,"blue":0.38431373,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[9782123335421401489,{"inputs":[{"Node":{"node_id":11656581020969095354,"output_index":0,"lambda":false}},{"Node":{"node_id":1019037285881657884,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2780251074492832077,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[1,[620.0443231093315,208.38630063890184]],[3,[679.189837009989,239.99177480754585]],[4,[654.5349442975197,224.51689533908117]],[2,[644.0435005900861,214.94345295604788]]]},"segments":{"add":[1,2,3,4],"remove":[],"start_point":[[2,2],[1,1],[3,3],[4,4]],"end_point":[[2,3],[3,4],[1,2],[4,1]],"handle_primary":[[2,[17.048596024579638,8.262011919603992]],[4,[-14.688021190407198,-10.884872846462486]],[3,[0.0,0.0]],[1,[0.0,0.0]]],"handle_end":[[4,[0.1311430463429133,0.13114304634288487]],[2,[-15.868308607493532,-9.835728475719122]],[3,[13.4932102981968,9.999432631699392]],[1,[-9.660678057982182,-4.68171321271447]]],"stroke":[[3,0],[4,0],[2,0],[1,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":4}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[17118107476414252025,{"inputs":[{"Node":{"node_id":6645255982686652881,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"DVec2":[74.2222222222222,480.0]},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[40.0,40.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.5,0.5]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3627710206997006419,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[3,[154.2366898148148,257.4780574845679]],[2,[149.94787379972564,262.84773662551436]],[1,[152.49382716049382,262.71604938271605]]]},"segments":{"add":[1,2,3],"remove":[],"start_point":[[1,1],[2,2],[3,3]],"end_point":[[2,3],[3,1],[1,2]],"handle_primary":[[2,[-0.2633744855966995,-0.4389574759944139]],[1,[0.0,0.0]],[3,[4.31137018907981,-2.5386217986682027]]],"handle_end":[[3,[2.8421709430404014e-14,0.0]],[2,[-3.3775342902714556,1.988760370600971]],[1,[0.4650366425890411,0.7750610709815646]]],"stroke":[[3,0],[1,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":3}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13128371516143508372,{"inputs":[{"Node":{"node_id":13035777574951374461,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[12838133055063962839,{"inputs":[{"Node":{"node_id":13644138583806412631,"output_index":0,"lambda":false}},{"Node":{"node_id":6973438081601736688,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7922156219537051964,{"inputs":[{"Node":{"node_id":5609799566275475322,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[15446793500614592278,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7,8],"remove":[],"delta":[[3,[722.3484224965707,77.2565157750343]],[5,[718.2222222222222,97.09739368998628]],[7,[718.3100137174213,77.2565157750343]],[2,[702.244170096022,76.11522633744856]],[1,[694.3429355281208,73.8326474622771]],[6,[724.6310013717421,85.86008230452676]],[8,[697.5034293552812,77.4320987654321]],[4,[725.5967078189301,90.3374485596708]]]},"segments":{"add":[1,2,3,4,5,6,7,8],"remove":[],"start_point":[[4,4],[5,5],[2,2],[7,7],[3,3],[6,6],[8,8],[1,1]],"end_point":[[5,6],[2,3],[1,2],[8,1],[6,7],[7,8],[3,4],[4,5]],"handle_primary":[[6,[-0.7023319615914261,-5.091906721536347]],[5,[0.0,0.0]],[3,[3.456189131014753,3.3025807251918877]],[2,[5.267489711934218,-0.7023319615912129]],[4,[-1.9392278971834005,5.143169640356035]],[8,[-3.5116598079559935,-1.6680384087791396]],[7,[-6.236870142765838,-1.74052190030676]],[1,[0.0,0.0]]],"handle_end":[[7,[3.5116598079559935,1.6680384087791396]],[4,[0.0,0.0]],[5,[0.6823799889585871,4.947254919948108]],[8,[0.08779149519887142,0.08779149519891405]],[1,[-5.267489711934218,0.7023319615912129]],[2,[-3.950617283950578,-3.775034293552821]],[3,[2.0192043895747247,-5.355281207133089]],[6,[3.7750342935527215,1.0534979423868265]]],"stroke":[[8,0],[6,0],[5,0],[7,0],[4,0],[1,0],[2,0],[3,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":8}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[9684857454501250999,{"inputs":[{"Node":{"node_id":8699675339613677057,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[13444661581815146533,{"inputs":[{"Node":{"node_id":16450742929146919960,"output_index":0,"lambda":false}},{"Node":{"node_id":10792166025753022402,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7274163206797151962,{"inputs":[{"Node":{"node_id":15303587427289959766,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14993053984267866751,{"inputs":[{"Node":{"node_id":13907578809542898348,"output_index":0,"lambda":false}},{"Node":{"node_id":9863310024364795214,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16195626650123806176,{"inputs":[{"Node":{"node_id":14057307926677215422,"output_index":0,"lambda":false}},{"Node":{"node_id":1869448627329502330,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[18279507457571359732,{"inputs":[{"Node":{"node_id":8697043784435445845,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[3121275823460307102,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5],"remove":[],"delta":[[1,[705.7777777777778,698.6666666666666]],[5,[595.5555555555555,791.1111111111111]],[2,[612.0,780.0]],[4,[449.77777777777777,1025.7777777777778]],[3,[452.88888888888886,1025.3333333333333]]]},"segments":{"add":[1,2,3,4,5],"remove":[],"start_point":[[1,1],[2,2],[3,3],[4,4],[5,5]],"end_point":[[1,2],[5,1],[4,5],[3,4],[2,3]],"handle_primary":[[1,[0.0,0.0]],[5,[54.93054949731868,-52.22097082256312]],[3,[0.0,0.0]],[4,[0.0,0.0]],[2,[-35.111111111111086,34.66666666666663]]],"handle_end":[[3,[0.0,0.0]],[5,[-1.1368683772161605e-13,-0.5925925925926094]],[4,[-99.11111111111104,94.22222222222229]],[2,[59.111111111111086,-144.8888888888889]],[1,[35.111111111111086,-34.66666666666663]]],"stroke":[[5,0],[1,0],[4,0],[3,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":5}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13269760558336088742,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5],"remove":[],"delta":[[3,[595.1111111111111,439.55555555555554]],[2,[447.1111111111111,332.44444444444446]],[4,[698.2222222222222,483.1111111111111]],[5,[756.4444444444443,438.22222222222223]],[1,[265.3333333333333,312.0]]]},"segments":{"add":[1,2,3,4],"remove":[],"start_point":[[2,2],[3,3],[4,4],[1,1]],"end_point":[[4,5],[1,2],[3,4],[2,3]],"handle_primary":[[2,[83.95959630801838,35.04735442215451]],[1,[0.0,0.0]],[3,[20.8888888888888,20.444444444444457]],[4,[22.46059594926794,-9.800987323316916]]],"handle_end":[[4,[-22.222222222222285,23.111111111111143]],[2,[-20.8888888888888,-20.444444444444457]],[3,[-48.888888888888914,21.33333333333331]],[1,[-96.88888888888886,-40.44444444444446]]],"stroke":[[4,0],[3,0],[1,0],[2,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11590691579869262546,{"inputs":[{"Node":{"node_id":11553850607251055696,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[13481022631108980683,{"inputs":[{"Node":{"node_id":9182448229950585507,"output_index":0,"lambda":false}},{"Node":{"node_id":12224498203743157414,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14797986717815207528,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5],"remove":[],"delta":[[2,[425.0,650.0]],[1,[80.0,557.0]],[3,[665.7777777777778,658.6666666666667]],[4,[826.6666666666665,552.4444444444443]],[5,[868.0,380.44444444444446]]]},"segments":{"add":[1,2,3,4],"remove":[],"start_point":[[4,4],[1,1],[2,2],[3,3]],"end_point":[[2,3],[4,5],[1,2],[3,4]],"handle_primary":[[2,[105.59298295237464,48.735222901095995]],[3,[0.0,0.0]],[4,[59.11111111111131,-70.66666666666652]],[1,[134.0,-75.0]]],"handle_end":[[2,[0.0,0.0]],[4,[0.0,0.0]],[3,[-59.11111111111131,70.66666666666652]],[1,[-104.0,-48.0]]],"stroke":[[1,0],[4,0],[3,0],[2,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[5861306074868809692,{"inputs":[{"Node":{"node_id":10190227675276560561,"output_index":0,"lambda":false}},{"Node":{"node_id":3636653585682494814,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13907578809542898348,{"inputs":[{"Node":{"node_id":12313564802550122052,"output_index":0,"lambda":false}},{"Node":{"node_id":15827578515555598997,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[581013017684525986,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2],"remove":[],"delta":[[2,[852.0,631.1111111111111]],[1,[803.5555555555554,878.6666666666665]]]},"segments":{"add":[1,2],"remove":[],"start_point":[[1,1],[2,2]],"end_point":[[2,1],[1,2]],"handle_primary":[[2,[-41.77777777777783,81.77777777777771]],[1,[0.0,0.0]]],"handle_end":[[1,[-37.77777777777783,80.88888888888903]],[2,[0.0,-0.4444444444443434]]],"stroke":[[1,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":2}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3670529450440935325,{"inputs":[{"Node":{"node_id":1384427686127078856,"output_index":0,"lambda":false}},{"Node":{"node_id":8543051864256131356,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[12030171742672119253,{"inputs":[{"Node":{"node_id":9688677048860875577,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[7450965328305122110,{"inputs":[{"Node":{"node_id":12969768453679160567,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.4},"exposed":false}},{"Value":{"tagged_value":{"F64":2.5},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[1806828617441445250,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[4,[32.0,1025.3333333333333]],[2,[304.6666666666667,765.3333333333333]],[1,[395.3333333333333,758.0]],[3,[147.33333333333334,814.0000000000001]]]},"segments":{"add":[1,2,3],"remove":[],"start_point":[[2,2],[1,1],[3,3]],"end_point":[[1,2],[2,3],[3,4]],"handle_primary":[[2,[-32.666666666666686,0.6666666666667425]],[1,[0.0,0.0]],[3,[-50.13723402627032,36.301698579412914]]],"handle_end":[[1,[32.666666666666686,-0.6666666666667425]],[3,[-0.6666666666666892,-122.66666666666686]],[2,[50.137234026270335,-36.301698579412914]]],"stroke":[[2,0],[1,0],[3,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13475705179546695973,{"inputs":[{"Node":{"node_id":11451028343967836482,"output_index":0,"lambda":false}},{"Node":{"node_id":501401493219507773,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[12969768453679160567,{"inputs":[{"Node":{"node_id":13045087323693407920,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":6.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[9276497172451351253,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[1,[606.8928516994359,102.3453741807651]],[2,[607.1269623532997,114.75323883554336]],[4,[605.9173906416706,103.71101966163694]],[3,[605.1760402377686,111.78783721993597]]]},"segments":{"add":[1,2,3,4],"remove":[],"start_point":[[2,2],[1,1],[4,4],[3,3]],"end_point":[[2,3],[1,2],[4,1],[3,4]],"handle_primary":[[3,[-0.585276634659408,-2.419143423258646]],[2,[0.0,0.0]],[4,[0.27360881696279193,-0.7182231445274425]],[1,[0.0,0.0]]],"handle_end":[[1,[-1.3656454808717626,-5.306508154244753]],[4,[0.0,0.03901844231063478]],[3,[-0.6242950769699291,1.6387745770462772]],[2,[0.585276634659408,2.4191434232586317]]],"stroke":[[2,0],[3,0],[1,0],[4,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":4}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7821977654068146599,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[3,[825.9524005971,863.6469292802573]],[1,[917.0,471.6]],[2,[826.5068586621596,856.9308484975209]]]},"segments":{"add":[1,2,3],"remove":[],"start_point":[[1,1],[3,3],[2,2]],"end_point":[[3,1],[1,2],[2,3]],"handle_primary":[[1,[0.0,0.0]],[3,[0.0,0.0]],[2,[0.0,0.0]]],"handle_end":[[1,[94.89314133784036,-231.73084849752092]],[3,[-0.39999999999997726,191.19999999999985]],[2,[0.0,0.0]]],"stroke":[[1,0],[3,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":3}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15126865253122550765,{"inputs":[{"Node":{"node_id":13014628586360765651,"output_index":0,"lambda":false}},{"Node":{"node_id":4307303572241320716,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2682920349304670808,{"inputs":[{"Node":{"node_id":10928540355449103287,"output_index":0,"lambda":false}},{"Node":{"node_id":16324258033206362312,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13368990606109678244,{"inputs":[{"Node":{"node_id":421715625023770179,"output_index":0,"lambda":false}},{"Node":{"node_id":15961046538654083626,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16290933138334939444,{"inputs":[{"Node":{"node_id":17426609415699324395,"output_index":0,"lambda":false}},{"Node":{"node_id":14888395629683671889,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[12496143061817048445,{"inputs":[{"Node":{"node_id":7525593029671097583,"output_index":0,"lambda":false}},{"Node":{"node_id":7654665057468818389,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[12880230498984021417,{"inputs":[{"Node":{"node_id":13280039933304076649,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[14883504161508594099,{"inputs":[{"Node":{"node_id":13368990606109678244,"output_index":0,"lambda":false}},{"Node":{"node_id":11025165626998987360,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[952330505278607301,{"inputs":[{"Node":{"node_id":15038739378867834454,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[5302437193964714993,{"inputs":[{"Node":{"node_id":2183999005109815989,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[10792166025753022402,{"inputs":[{"Node":{"node_id":2780251074492832077,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[16649851742084147477,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2],"remove":[],"delta":[[1,[870.6666666666665,383.55555555555554]],[2,[838.6666666666666,564.0]]]},"segments":{"add":[1],"remove":[],"start_point":[[1,1]],"end_point":[[1,2]],"handle_primary":[[1,[16.000000000000227,37.33333333333337]]],"handle_end":[[1,[48.44444444444446,-91.11111111111109]]],"stroke":[[1,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[1272070255512697108,{"inputs":[{"Node":{"node_id":14012648643507848353,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[17147975601187022720,{"inputs":[{"Node":{"node_id":18015048324114736039,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[15518174914032911052,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6],"remove":[],"delta":[[3,[639.1111111111112,614.6666666666666]],[6,[129.77777777777777,406.2222222222222]],[4,[429.7777777777778,551.5555555555555]],[2,[814.2222222222223,498.66666666666663]],[1,[851.5555555555557,370.66666666666663]],[5,[262.6666666666667,423.5555555555556]]]},"segments":{"add":[1,2,3,4,5],"remove":[],"start_point":[[4,4],[2,2],[3,3],[1,1],[5,5]],"end_point":[[4,5],[1,2],[5,6],[3,4],[2,3]],"handle_primary":[[4,[-74.22222222222217,-57.77777777777783]],[3,[-83.11111111111109,3.111111111111086]],[5,[-58.2222222222222,-21.77777777777783]],[2,[-43.55555555555554,54.66666666666663]],[1,[0.0,0.0]]],"handle_end":[[3,[74.22222222222217,57.77777777777783]],[5,[57.333333333333314,-5.777777777777828]],[1,[43.55555555555554,-54.66666666666663]],[4,[66.87431172777582,25.01405553176352]],[2,[83.11111111111109,-3.111111111111086]]],"stroke":[[2,0],[4,0],[5,0],[3,0],[1,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[17078740291337047697,{"inputs":[{"Node":{"node_id":3406722917122601552,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.84765625,"green":0.5384252,"blue":0.3874054,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.84765625,"green":0.5384252,"blue":0.3874054,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[10264089084180279094,{"inputs":[{"Node":{"node_id":5213978458941436169,"output_index":0,"lambda":false}},{"Node":{"node_id":4332145463108161926,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.0},"exposed":false}},{"Value":{"tagged_value":{"F64":60.0},"exposed":false}},{"Value":{"tagged_value":{"F64":-100.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[7472360693015927574,{"inputs":[{"Node":{"node_id":4832236468224231783,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":6.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4859656512650360562,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[2,[249.3333333333334,898.0]],[3,[416.66666666666663,803.3333333333333]],[1,[163.33333333333343,1025.3333333333333]]]},"segments":{"add":[1,2],"remove":[],"start_point":[[2,2],[1,1]],"end_point":[[1,2],[2,3]],"handle_primary":[[1,[0.0,0.0]],[2,[40.66666666666666,-40.666666666666515]]],"handle_end":[[1,[-45.09988913511887,45.099889135118815]],[2,[-77.99999999999994,22.666666666666742]]],"stroke":[[2,0],[1,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4265165189651403984,{"inputs":[{"Value":{"tagged_value":{"GraphicGroup":{"instance":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":10264089084180279094,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13280039933304076649,{"inputs":[{"Node":{"node_id":14012583111791538162,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[12428327489525325219,{"inputs":[{"Node":{"node_id":14209241002058525241,"output_index":0,"lambda":false}},{"Node":{"node_id":1984475088429379731,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16767482995096345179,{"inputs":[{"Node":{"node_id":6532401937876437300,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[5278509881589546420,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[3,[823.7037037037037,861.8666666666667]],[1,[899.1111111111111,600.0000000000001]],[2,[824.4444444444445,850.2222222222223]]]},"segments":{"add":[1,2,3],"remove":[],"start_point":[[2,2],[3,3],[1,1]],"end_point":[[1,2],[2,3],[3,1]],"handle_primary":[[1,[0.0,0.0]],[3,[0.0,0.0]],[2,[0.0,0.0]]],"handle_end":[[3,[-26.31111111111113,120.79999999999984]],[1,[39.55555555555554,-105.8222222222222]],[2,[0.0,0.0]]],"stroke":[[3,0],[2,0],[1,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":3}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7659717355245331967,{"inputs":[{"Node":{"node_id":18422317423856403288,"output_index":0,"lambda":false}},{"Node":{"node_id":4479074488343511985,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[8697043784435445845,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35],"remove":[],"delta":[[12,[199.11111111111111,214.51851851851853]],[9,[326.22222222222223,208.0]],[17,[183.50617283950615,231.70370370370372]],[23,[185.37661941777165,263.56957780826093]],[8,[413.77777777777777,199.55555555555551]],[19,[205.23456790123456,227.55555555555557]],[29,[369.3827160493828,240.19753086419755]],[20,[217.87654320987656,231.90123456790127]],[24,[188.90085842299663,268.4351595864769]],[10,[271.1111111111111,207.55555555555551]],[5,[616.4444444444443,170.22222222222223]],[1,[699.5555555555554,303.55555555555554]],[11,[208.44444444444443,212.0]],[22,[195.95061728395063,253.8271604938272]],[21,[216.8888888888889,238.22222222222223]],[4,[647.5555555555554,171.55555555555557]],[28,[278.9135802469136,223.80246913580248]],[14,[155.06172839506175,249.08641975308643]],[31,[463.01234567901247,246.71604938271605]],[30,[425.4814814814815,246.71604938271605]],[15,[155.85185185185185,253.03703703703707]],[13,[173.03703703703707,226.962962962963]],[34,[647.5061728395062,240.79012345679013]],[35,[680.888888888889,281.48148148148147]],[25,[201.87654320987656,262.12345679012344]],[33,[602.2716049382716,229.5308641975309]],[18,[195.1604938271605,228.54320987654324]],[32,[526.0246913580247,240.79012345679013]],[16,[172.44444444444446,239.40740740740745]],[2,[701.7777777777777,252.0]],[26,[227.55555555555557,246.51851851851853]],[7,[452.0,206.22222222222223]],[3,[679.9012345679013,198.716049382716]],[27,[251.06172839506175,233.283950617284]],[6,[553.7777777777777,195.11111111111111]]]},"segments":{"add":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35],"remove":[],"start_point":[[9,9],[4,4],[11,11],[30,30],[7,7],[35,35],[13,13],[28,28],[27,27],[15,15],[2,2],[16,16],[6,6],[14,14],[3,3],[25,25],[24,24],[33,33],[34,34],[18,18],[17,17],[5,5],[31,31],[22,22],[8,8],[10,10],[23,23],[21,21],[32,32],[29,29],[26,26],[20,20],[1,1],[19,19],[12,12]],"end_point":[[31,32],[19,20],[13,14],[7,8],[20,21],[18,19],[35,1],[25,26],[33,34],[15,16],[26,27],[34,35],[30,31],[17,18],[11,12],[29,30],[6,7],[23,24],[27,28],[4,5],[24,25],[22,23],[16,17],[8,9],[9,10],[12,13],[14,15],[32,33],[10,11],[28,29],[3,4],[1,2],[2,3],[5,6],[21,22]],"handle_primary":[[15,[3.7530864197531177,-1.580246913580254]],[21,[-3.753086419753061,3.5555555555555713]],[33,[24.098765432098844,-2.5679012345678984]],[5,[-12.0,3.555555555555543]],[30,[11.061728395061778,0.7901234567900985]],[35,[10.469135802469168,11.851851851851848]],[26,[8.493827160493822,-2.765432098765416]],[25,[4.938271604938279,-3.160493827160451]],[9,[-30.22222222222223,1.3333333333333712]],[34,[10.074074074074131,11.85185185185182]],[1,[0.0,0.0]],[17,[2.7654320987654444,-0.790123456790127]],[28,[14.81481481481478,1.9753086419753176]],[22,[-8.16460905349794,4.4115226337448235]],[10,[-12.888888888888856,1.7777777777778567]],[12,[-5.53086419753086,3.3580246913580254]],[14,[-1.61975308641982,1.935802469135723]],[4,[-10.222222222222172,-3.5555555555555713]],[7,[-8.444444444444457,-2.2222222222222285]],[13,[-9.28395061728395,7.703703703703695]],[31,[19.753086419753004,-4.543209876543159]],[24,[3.3430068414448044,-0.5735531240474074]],[29,[29.4320987654321,3.358024691358054]],[6,[-23.11111111111109,9.777777777777771]],[23,[-0.9364426154549506,2.4191434232586175]],[8,[-25.33333333333331,1.7777777777778567]],[3,[-17.576025737442137,-14.306067460708704]],[16,[5.530864197530889,-7.111111111111143]],[27,[6.518518518518505,-6.518518518518562]],[18,[4.148148148148124,-1.3827160493827364]],[19,[4.74074074074079,0.9876543209876728]],[2,[-2.913580246913398,-22.66666666666669]],[32,[23.90123456790127,-2.765432098765416]],[11,[0.0,0.0]],[20,[2.3703703703704093,1.185185185185162]]],"handle_end":[[16,[-2.765432098765416,0.790123456790127]],[6,[8.444444444444457,2.222222222222257]],[28,[-29.4320987654321,-3.358024691357997]],[4,[12.0,-3.555555555555543]],[9,[12.888888888888856,-1.777777777777743]],[31,[-23.90123456790127,2.7654320987653875]],[18,[-4.740740740740705,-0.9876543209876728]],[34,[-10.469135802469168,-11.851851851851848]],[8,[30.22222222222223,-1.3333333333333712]],[22,[0.752878950104872,-1.9449372877709263]],[3,[10.222222222222172,3.5555555555555713]],[26,[-6.518518518518505,6.518518518518505]],[30,[-19.753086419753004,4.543209876543187]],[11,[5.530864197530917,-3.3580246913580254]],[33,[-10.074074074074131,-11.851851851851848]],[2,[8.493827160493879,6.913580246913597]],[25,[-8.493827160493822,2.765432098765416]],[13,[1.4782632300064904,-1.7667048358613044]],[32,[-24.098765432098844,2.5679012345678984]],[35,[0.0,5.684341886080804e-14]],[17,[-4.148148148148152,1.3827160493827648]],[29,[-11.061728395061778,-0.790123456790127]],[24,[-4.938271604938279,3.160493827160451]],[19,[-2.3703703703704093,-1.185185185185162]],[7,[25.33333333333331,-1.777777777777743]],[20,[3.753086419753089,-3.5555555555556]],[1,[2.822923929132685,21.961391245287817]],[15,[-5.530864197530889,7.111111111111086]],[5,[23.11111111111109,-9.777777777777745]],[23,[-1.24660051630255,0.213876804468498]],[10,[20.88888888888889,-1.4814814814814952]],[27,[-14.81481481481478,-1.9753086419753176]],[21,[9.952891875905069,-5.377772223271279]],[14,[-3.7530864197531177,1.580246913580254]],[12,[9.283950617283978,-7.703703703703695]]],"stroke":[[35,0],[3,0],[8,0],[13,0],[33,0],[32,0],[21,0],[23,0],[28,0],[17,0],[6,0],[26,0],[20,0],[5,0],[12,0],[27,0],[29,0],[24,0],[4,0],[11,0],[34,0],[30,0],[15,0],[25,0],[7,0],[31,0],[19,0],[16,0],[1,0],[9,0],[2,0],[14,0],[18,0],[22,0],[10,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":35}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4236845268521674740,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[2,[568.8888888888889,785.4814814814813]],[3,[393.1851851851852,1025.4814814814813]],[1,[397.6296296296296,1025.185185185185]]]},"segments":{"add":[1,2,3],"remove":[],"start_point":[[1,1],[3,3],[2,2]],"end_point":[[3,1],[1,2],[2,3]],"handle_primary":[[3,[0.0,0.0]],[1,[0.0,0.0]],[2,[0.0,0.0]]],"handle_end":[[3,null],[1,[-153.1851851851851,112.88888888888891]],[2,[33.777777777777885,-150.22222222222194]]],"stroke":[[1,0],[3,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":3}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[1984475088429379731,{"inputs":[{"Node":{"node_id":1500690448497424903,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[9271343782272072828,{"inputs":[{"Node":{"node_id":4078100635676202528,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[514796034658094296,{"inputs":[{"Node":{"node_id":13352561089252322209,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[8698602280607307123,{"inputs":[{"Node":{"node_id":14098374807212007572,"output_index":0,"lambda":false}},{"Node":{"node_id":14285767317419627814,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10770443343193024138,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7],"remove":[],"delta":[[1,[616.0987654320988,23.01234567901235]],[4,[656.6913580246915,28.049382716049383]],[7,[634.1618655692731,33.7997256515775]],[3,[634.172839506173,30.814814814814817]],[6,[656.4609053497943,30.375857338820303]],[5,[671.3086419753088,28.641975308641975]],[2,[621.0370370370372,23.01234567901235]]]},"segments":{"add":[1,2,3,4,5,6,7],"remove":[],"start_point":[[4,4],[7,7],[1,1],[3,3],[2,2],[5,5],[6,6]],"end_point":[[7,1],[5,6],[4,5],[6,7],[2,3],[3,4],[1,2]],"handle_primary":[[7,[-6.408779149519887,-0.8340192043895769]],[1,[0.0,0.0]],[2,[1.1851851851851052,1.5802469135802468]],[6,[-10.31550068587103,2.4142661179698237]],[3,[6.024691358024711,0.4938271604938329]],[4,[4.345679012345727,-0.39506172839505993]],[5,[0.0,0.0]]],"handle_end":[[3,[-4.345679012345727,0.39506172839506704]],[4,[-0.39506172839503506,-0.5925925925925917]],[1,[-1.1851851851851052,-1.5802469135802468]],[7,[4.455418381344316,5.4759945130315515]],[5,[10.31550068587103,-2.4142661179698237]],[6,[6.408779149519887,0.8340192043895769]],[2,[-6.024691358024711,-0.49382716049382935]]],"stroke":[[4,0],[1,0],[7,0],[5,0],[2,0],[3,0],[6,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":7}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[1019037285881657884,{"inputs":[{"Node":{"node_id":7274163206797151962,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[8410534738018320047,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2],"remove":[],"delta":[[2,[762.5185185185184,667.5061728395063]],[1,[834.6666666666665,551.8024691358028]]]},"segments":{"add":[1,2],"remove":[],"start_point":[[2,2],[1,1]],"end_point":[[2,1],[1,2]],"handle_primary":[[2,[44.88888888888857,-64.49382716049388]],[1,[0.0,0.0]]],"handle_end":[[2,null],[1,[47.85185185185162,-63.160493827160394]]],"stroke":[[2,0],[1,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":2}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2397243911096708995,{"inputs":[{"Node":{"node_id":10587073897090054035,"output_index":0,"lambda":false}},{"Node":{"node_id":7505360855062237520,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[541002100261582638,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[1,[456.88888888888886,483.55555555555554]],[4,[648.4444444444443,543.5555555555555]],[3,[609.7777777777777,559.5555555555555]],[2,[536.8888888888889,544.4444444444445]]]},"segments":{"add":[1,2,3],"remove":[],"start_point":[[2,2],[1,1],[3,3]],"end_point":[[2,3],[3,4],[1,2]],"handle_primary":[[3,[20.0,-7.555555555555543]],[2,[25.777777777777715,11.555555555555545]],[1,[0.0,0.0]]],"handle_end":[[3,[0.0,0.0]],[1,[-25.777777777777715,-11.555555555555545]],[2,[-20.0,7.555555555555543]]],"stroke":[[1,0],[2,0],[3,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[5009664118231399060,{"inputs":[{"Node":{"node_id":3226457726231232839,"output_index":0,"lambda":false}},{"Node":{"node_id":17207895962122263432,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[1378578509112405,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5],"remove":[],"delta":[[4,[594.6410608139003,75.57872275567746]],[3,[590.4855967078191,66.80932784636488]],[5,[593.3924706599604,60.59564090839812]],[1,[602.6886145404666,50.91906721536352]],[2,[599.5281207133061,50.3923182441701]]]},"segments":{"add":[1,2,3,4,5],"remove":[],"start_point":[[4,4],[2,2],[5,5],[1,1],[3,3]],"end_point":[[3,4],[5,1],[2,3],[4,5],[1,2]],"handle_primary":[[3,[1.9314128943758533,7.3257125438195345]],[1,[0.0,0.0]],[5,[1.248590153939972,-3.9798811156835896]],[4,[0.0,0.0]],[2,[-1.843621399176982,0.5267489711934203]]],"handle_end":[[3,[0.0,0.0]],[5,[-4.379820149367788,0.9754610577655498]],[1,[1.843621399176982,-0.5267489711934203]],[2,[-2.7532629181224593,-10.4429315732828]],[4,[-1.704168058538812,5.432035686592322]]],"stroke":[[2,0],[1,0],[5,0],[4,0],[3,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":5}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[501401493219507773,{"inputs":[{"Node":{"node_id":9425359632144678256,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[2394762731964337494,{"inputs":[{"Value":{"tagged_value":{"ArtboardGroup":{"instance":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":4422453582814483232,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"IVec2":[0,0]},"exposed":false}},{"Value":{"tagged_value":{"IVec2":[1024,1024]},"exposed":false}},{"Value":{"tagged_value":{"Color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graph_craft::document::value::TaggedValue","alias":null}},"import_index":1}},{"Value":{"tagged_value":{"String":"Artboard"},"exposed":false}},{"Network":{"import_type":{"Concrete":{"name":"graph_craft::document::value::TaggedValue","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"graph_craft::document::value::TaggedValue","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"graph_craft::document::value::TaggedValue","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"graph_craft::document::value::TaggedValue","alias":null}},"import_index":5}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToArtboardNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Network":{"import_type":{"Fn":[{"Concrete":{"name":"core::option::Option>","alias":null}},{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}}]},"import_index":0}},{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::AppendArtboardNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3226457726231232839,{"inputs":[{"Node":{"node_id":4493274523708782092,"output_index":0,"lambda":false}},{"Node":{"node_id":7922156219537051964,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[6645255982686652881,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"line_cap":"Butt","line_join":"Miter","line_join_miter_limit":4.0,"transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"opacity":1.0,"blend_mode":"Normal"}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[2,[1.0,0.5]],[4,[0.0,0.5]],[3,[0.5,1.0]],[1,[0.5,0.0]]]},"segments":{"add":[1,2,3,4],"remove":[],"start_point":[[3,3],[1,1],[4,4],[2,2]],"end_point":[[2,3],[1,2],[3,4],[4,1]],"handle_primary":[[2,[0.0,0.27589238888950707]],[1,[0.27589238888950707,0.0]],[4,[0.0,-0.275892388889507]],[3,[-0.275892388889507,0.0]]],"handle_end":[[4,[-0.275892388889507,0.0]],[3,[0.0,0.27589238888950707]],[1,[0.0,-0.275892388889507]],[2,[0.27589238888950707,0.0]]],"stroke":[[2,0],[4,0],[1,0],[3,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":4}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[1162381870526064378,{"inputs":[{"Value":{"tagged_value":{"GraphicGroup":{"instance":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":9271343782272072828,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[9698363115186534174,{"inputs":[{"Node":{"node_id":17819505448204350775,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[5471152581000334146,{"inputs":[{"Node":{"node_id":12761901161949743155,"output_index":0,"lambda":false}},{"Node":{"node_id":952330505278607301,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15827578515555598997,{"inputs":[{"Node":{"node_id":15656854169166220905,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14539627480594383748,{"inputs":[{"Node":{"node_id":581013017684525986,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[2478872006455149410,{"inputs":[{"Node":{"node_id":2440895173483452224,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15637103575662751567,{"inputs":[{"Node":{"node_id":314278016428495768,"output_index":0,"lambda":false}},{"Node":{"node_id":4350324834849900949,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10375238420217738812,{"inputs":[{"Node":{"node_id":11022999329156494369,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[7026139249717690649,{"inputs":[{"Node":{"node_id":1806828617441445250,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":8.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":4}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]},"network_metadata":{"persistent_metadata":{"node_metadata":[[1204243038352113866,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10420981328998103391,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11194653561109699287,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[8595304668947966919,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14862049226133442027,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[12496143061817048445,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[12594527670567285670,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[4493274523708782092,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[8375495949882478840,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15798070933198867970,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[5185036609290210853,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[17891208858820401648,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"x":"X","input_name":"Translation","unit":" px","y":"Y"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"input_name":"Scale","x":"W","unit":"x","y":"H"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"hidden"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[7922156219537051964,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"range_min":0.0,"blank_assist":true,"is_integer":false,"input_name":"Random Scale Min","mode":"Range","tooltip":"Minimum range of randomized sizes given to each instance","range_max":2.0,"unit":"x","min":0.0},"widget_override":"number"},{"input_data":{"min":0.0,"range_min":0.0,"blank_assist":true,"is_integer":false,"mode":"Range","unit":"x","tooltip":"Minimum range of randomized sizes given to each instance","input_name":"Random Scale Max","range_max":2.0},"widget_override":"number"},{"input_data":{"input_name":"Random Scale Bias","mode":"Range","range_max":50.0,"range_min":-50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","blank_assist":true,"is_integer":false},"widget_override":"number"},{"input_data":{"min":0.0,"is_integer":true,"mode":"Increment","blank_assist":true,"tooltip":"Seed to determine unique variations on all the randomized instance sizes","input_name":"Random Scale Seed"},"widget_override":"number"},{"input_data":{"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","input_name":"Random Rotation","mode":"Range","min":0.0,"blank_assist":true,"unit":"°","max":360.0,"is_integer":false},"widget_override":"number"},{"input_data":{"min":0.0,"blank_assist":true,"input_name":"Random Rotation Seed","tooltip":"Seed to determine unique variations on all the randomized instance angles","is_integer":true,"mode":"Increment"},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[5471152581000334146,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16434255153991868080,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"range_min":0.0,"unit":"x","range_max":2.0,"tooltip":"Minimum range of randomized sizes given to each instance","mode":"Range","min":0.0,"blank_assist":true,"is_integer":false,"input_name":"Random Scale Min"},"widget_override":"number"},{"input_data":{"input_name":"Random Scale Max","is_integer":false,"min":0.0,"range_min":0.0,"range_max":2.0,"unit":"x","mode":"Range","tooltip":"Minimum range of randomized sizes given to each instance","blank_assist":true},"widget_override":"number"},{"input_data":{"blank_assist":true,"input_name":"Random Scale Bias","is_integer":false,"mode":"Range","range_min":-50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","range_max":50.0},"widget_override":"number"},{"input_data":{"min":0.0,"tooltip":"Seed to determine unique variations on all the randomized instance sizes","mode":"Increment","blank_assist":true,"input_name":"Random Scale Seed","is_integer":true},"widget_override":"number"},{"input_data":{"max":360.0,"min":0.0,"mode":"Range","is_integer":false,"input_name":"Random Rotation","unit":"°","tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","blank_assist":true},"widget_override":"number"},{"input_data":{"mode":"Increment","blank_assist":true,"min":0.0,"input_name":"Random Rotation Seed","is_integer":true,"tooltip":"Seed to determine unique variations on all the randomized instance angles"},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[4663768795652429571,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4909350123806022131,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[9688677048860875577,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"min":1.0,"mode":"Increment","tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","blank_assist":true,"input_name":"Spacing","unit":" px","is_integer":false},"widget_override":"number"},{"input_data":{"unit":" px","input_name":"Start Offset","is_integer":false,"blank_assist":true,"min":0.0,"mode":"Increment","tooltip":"Exclude some distance from the start of the path before the first instance"},"widget_override":"number"},{"input_data":{"unit":" px","input_name":"Stop Offset","min":0.0,"blank_assist":true,"mode":"Increment","tooltip":"Exclude some distance from the end of the path after the last instance","is_integer":false},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,5]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[9782123335421401489,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10086073308516686449,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[6666260895482068061,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[172538270105470471,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[4859656512650360562,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[12428327489525325219,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10860592954464951000,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[4479074488343511985,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[514796034658094296,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[2440895173483452224,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[17147975601187022720,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[314278016428495768,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[6292009934909381201,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Absolute":[-17,88]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15578929303912288394,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[11632506522064533635,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[3970516859959908758,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[9847383247226990698,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[17494926338451345058,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[1984475088429379731,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"range_max":2.0,"unit":"x","is_integer":false,"range_min":0.0,"tooltip":"Minimum range of randomized sizes given to each instance","blank_assist":true,"input_name":"Random Scale Min","mode":"Range","min":0.0},"widget_override":"number"},{"input_data":{"min":0.0,"range_max":2.0,"input_name":"Random Scale Max","mode":"Range","range_min":0.0,"unit":"x","blank_assist":true,"is_integer":false,"tooltip":"Minimum range of randomized sizes given to each instance"},"widget_override":"number"},{"input_data":{"input_name":"Random Scale Bias","tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","is_integer":false,"mode":"Range","range_max":50.0,"range_min":-50.0,"blank_assist":true},"widget_override":"number"},{"input_data":{"mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance sizes","input_name":"Random Scale Seed","is_integer":true,"blank_assist":true,"min":0.0},"widget_override":"number"},{"input_data":{"input_name":"Random Rotation","max":360.0,"min":0.0,"is_integer":false,"mode":"Range","tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","unit":"°","blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":true,"min":0.0,"mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance angles","blank_assist":true,"input_name":"Random Rotation Seed"},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[7821977654068146599,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13475705179546695973,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4332145463108161926,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-31,292]}}},"network_metadata":null}}],[7466034304713056391,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13280039933304076649,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"blank_assist":true,"mode":"Increment","unit":" px","min":1.0,"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","input_name":"Spacing","is_integer":false},"widget_override":"number"},{"input_data":{"tooltip":"Exclude some distance from the start of the path before the first instance","is_integer":false,"min":0.0,"unit":" px","mode":"Increment","input_name":"Start Offset","blank_assist":true},"widget_override":"number"},{"input_data":{"unit":" px","is_integer":false,"input_name":"Stop Offset","tooltip":"Exclude some distance from the end of the path after the last instance","min":0.0,"blank_assist":true,"mode":"Increment"},"widget_override":"number"},{"input_data":{"tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly","input_name":"Adaptive Spacing"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,5]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[17064046832210629373,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14888395629683671889,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"input_name":"Random Scale Min","unit":"x","tooltip":"Minimum range of randomized sizes given to each instance","is_integer":false,"mode":"Range","range_min":0.0,"blank_assist":true,"min":0.0,"range_max":2.0},"widget_override":"number"},{"input_data":{"min":0.0,"range_max":2.0,"range_min":0.0,"mode":"Range","tooltip":"Minimum range of randomized sizes given to each instance","input_name":"Random Scale Max","is_integer":false,"unit":"x","blank_assist":true},"widget_override":"number"},{"input_data":{"blank_assist":true,"mode":"Range","range_max":50.0,"input_name":"Random Scale Bias","is_integer":false,"range_min":-50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)"},"widget_override":"number"},{"input_data":{"input_name":"Random Scale Seed","mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance sizes","blank_assist":true,"is_integer":true,"min":0.0},"widget_override":"number"},{"input_data":{"is_integer":false,"min":0.0,"max":360.0,"input_name":"Random Rotation","blank_assist":true,"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","mode":"Range","unit":"°"},"widget_override":"number"},{"input_data":{"input_name":"Random Rotation Seed","min":0.0,"tooltip":"Seed to determine unique variations on all the randomized instance angles","blank_assist":true,"mode":"Increment","is_integer":true},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[4572557574846980832,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"tooltip":"Artwork to be copied and placed at each point","input_name":"Instance"},"widget_override":null},{"input_data":{"range_min":0.0,"unit":"x","tooltip":"Minimum range of randomized sizes given to each instance","is_integer":false,"blank_assist":true,"input_name":"Random Scale Min","min":0.0,"mode":"Range","range_max":2.0},"widget_override":"number"},{"input_data":{"unit":"x","is_integer":false,"range_min":0.0,"mode":"Range","blank_assist":true,"min":0.0,"tooltip":"Minimum range of randomized sizes given to each instance","range_max":2.0,"input_name":"Random Scale Max"},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"input_name":"Random Scale Bias","mode":"Range","range_min":-50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","range_max":50.0},"widget_override":"number"},{"input_data":{"blank_assist":true,"min":0.0,"mode":"Increment","is_integer":true,"tooltip":"Seed to determine unique variations on all the randomized instance sizes","input_name":"Random Scale Seed"},"widget_override":"number"},{"input_data":{"is_integer":false,"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","input_name":"Random Rotation","max":360.0,"blank_assist":true,"min":0.0,"unit":"°","mode":"Range"},"widget_override":"number"},{"input_data":{"min":0.0,"blank_assist":true,"mode":"Increment","input_name":"Random Rotation Seed","is_integer":true,"tooltip":"Seed to determine unique variations on all the randomized instance angles"},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[5609799566275475322,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"is_integer":false,"mode":"Increment","tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","input_name":"Spacing","unit":" px","blank_assist":true,"min":1.0},"widget_override":"number"},{"input_data":{"mode":"Increment","is_integer":false,"unit":" px","input_name":"Start Offset","min":0.0,"tooltip":"Exclude some distance from the start of the path before the first instance","blank_assist":true},"widget_override":"number"},{"input_data":{"blank_assist":true,"is_integer":false,"min":0.0,"mode":"Increment","tooltip":"Exclude some distance from the end of the path after the last instance","unit":" px","input_name":"Stop Offset"},"widget_override":"number"},{"input_data":{"tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly","input_name":"Adaptive Spacing"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,5]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16175421708184657649,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[5174744389209053970,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14098374807212007572,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[7654665057468818389,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[10795820039540504703,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[9684857454501250999,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[3150436463719911922,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{"x":"X","y":"Y","unit":" px"},"widget_override":"vec2"},{"input_data":{},"widget_override":"transform_rotation"},{"input_data":{"x":"W","y":"H","unit":"x"},"widget_override":"vec2"},{"input_data":{},"widget_override":"transform_skew"},{"input_data":{},"widget_override":"hidden"}],"output_names":["Data"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15857077552290328068,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11479098559726891734,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[12838133055063962839,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[12531351117929704587,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[17324767436949538365,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14539627480594383748,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[14894569344576297448,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[3165571685352930240,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14537754528543289381,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[5326536612985524219,{"persistent_metadata":{"reference":"Scatter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"blank_assist":true,"input_name":"Separation Disk Diameter","range_min":1.0,"is_integer":false,"min":0.01,"mode":"Range","range_max":100.0},"widget_override":"number"},{"input_data":{"blank_assist":true,"mode":"Increment","is_integer":true,"input_name":"Seed","min":0.0},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Poisson-Disk Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[3170924135668664007,{"persistent_metadata":{"reference":"Merge","display_name":"Pointing Arm","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":6}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15177845878727456758,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[13163272246010991228,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10770443343193024138,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2959546142916532439,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[18214377096178867498,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"mode":"Range","range_min":0.0,"min":0.0,"blank_assist":true,"range_max":2.0,"tooltip":"Minimum range of randomized sizes given to each instance","input_name":"Random Scale Min","is_integer":false,"unit":"x"},"widget_override":"number"},{"input_data":{"blank_assist":true,"is_integer":false,"min":0.0,"range_max":2.0,"mode":"Range","unit":"x","range_min":0.0,"input_name":"Random Scale Max","tooltip":"Minimum range of randomized sizes given to each instance"},"widget_override":"number"},{"input_data":{"mode":"Range","blank_assist":true,"input_name":"Random Scale Bias","is_integer":false,"range_max":50.0,"range_min":-50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)"},"widget_override":"number"},{"input_data":{"is_integer":true,"mode":"Increment","min":0.0,"tooltip":"Seed to determine unique variations on all the randomized instance sizes","blank_assist":true,"input_name":"Random Scale Seed"},"widget_override":"number"},{"input_data":{"max":360.0,"unit":"°","is_integer":false,"input_name":"Random Rotation","min":0.0,"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","blank_assist":true,"mode":"Range"},"widget_override":"number"},{"input_data":{"input_name":"Random Rotation Seed","is_integer":true,"min":0.0,"blank_assist":true,"mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance angles"},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[541002100261582638,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15827578515555598997,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[1378578509112405,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[17207349373429328029,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[7450965328305122110,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"range_max":2.0,"mode":"Range","blank_assist":true,"range_min":0.0,"input_name":"Random Scale Min","min":0.0,"tooltip":"Minimum range of randomized sizes given to each instance","is_integer":false,"unit":"x"},"widget_override":"number"},{"input_data":{"input_name":"Random Scale Max","is_integer":false,"min":0.0,"range_max":2.0,"blank_assist":true,"range_min":0.0,"tooltip":"Minimum range of randomized sizes given to each instance","mode":"Range","unit":"x"},"widget_override":"number"},{"input_data":{"mode":"Range","input_name":"Random Scale Bias","tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","is_integer":false,"blank_assist":true,"range_max":50.0,"range_min":-50.0},"widget_override":"number"},{"input_data":{"mode":"Increment","input_name":"Random Scale Seed","blank_assist":true,"min":0.0,"tooltip":"Seed to determine unique variations on all the randomized instance sizes","is_integer":true},"widget_override":"number"},{"input_data":{"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","unit":"°","blank_assist":true,"input_name":"Random Rotation","is_integer":false,"max":360.0,"mode":"Range","min":0.0},"widget_override":"number"},{"input_data":{"is_integer":true,"blank_assist":true,"input_name":"Random Rotation Seed","mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance angles","min":0.0},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[7320676248579211727,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[12131058586835568367,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13907578809542898348,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[3121275823460307102,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[8697043784435445845,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16551385471328831128,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14831840560430171946,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4105711298139980122,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[9698363115186534174,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"tooltip":"Minimum range of randomized sizes given to each instance","unit":"x","min":0.0,"range_max":2.0,"mode":"Range","input_name":"Random Scale Min","range_min":0.0,"is_integer":false,"blank_assist":true},"widget_override":"number"},{"input_data":{"unit":"x","input_name":"Random Scale Max","blank_assist":true,"mode":"Range","range_max":2.0,"tooltip":"Minimum range of randomized sizes given to each instance","is_integer":false,"min":0.0,"range_min":0.0},"widget_override":"number"},{"input_data":{"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","range_max":50.0,"range_min":-50.0,"blank_assist":true,"mode":"Range","input_name":"Random Scale Bias","is_integer":false},"widget_override":"number"},{"input_data":{"mode":"Increment","input_name":"Random Scale Seed","tooltip":"Seed to determine unique variations on all the randomized instance sizes","min":0.0,"is_integer":true,"blank_assist":true},"widget_override":"number"},{"input_data":{"blank_assist":true,"mode":"Range","unit":"°","input_name":"Random Rotation","max":360.0,"is_integer":false,"min":0.0,"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise"},"widget_override":"number"},{"input_data":{"input_name":"Random Rotation Seed","mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance angles","blank_assist":true,"is_integer":true,"min":0.0},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[12224498203743157414,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[5455777299776842371,{"persistent_metadata":{"reference":"Merge","display_name":"Beaded Skirt","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":78}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[9863310024364795214,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[3649809135741361946,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[5009664118231399060,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[3968318310636120842,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Spacing","is_integer":false,"mode":"Increment","blank_assist":true,"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","unit":" px","min":1.0},"widget_override":"number"},{"input_data":{"tooltip":"Exclude some distance from the start of the path before the first instance","min":0.0,"mode":"Increment","input_name":"Start Offset","is_integer":false,"blank_assist":true,"unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"input_name":"Stop Offset","min":0.0,"mode":"Increment","tooltip":"Exclude some distance from the end of the path after the last instance","unit":" px"},"widget_override":"number"},{"input_data":{"tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly","input_name":"Adaptive Spacing"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,5]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10619788176782820865,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15498700602024283966,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[3414873131936208778,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4453139144069993994,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[3535178979443201645,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10586744777717861556,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"range_max":2.0,"input_name":"Random Scale Min","mode":"Range","tooltip":"Minimum range of randomized sizes given to each instance","blank_assist":true,"is_integer":false,"min":0.0,"range_min":0.0,"unit":"x"},"widget_override":"number"},{"input_data":{"unit":"x","range_max":2.0,"min":0.0,"range_min":0.0,"input_name":"Random Scale Max","blank_assist":true,"mode":"Range","tooltip":"Minimum range of randomized sizes given to each instance","is_integer":false},"widget_override":"number"},{"input_data":{"mode":"Range","blank_assist":true,"range_max":50.0,"is_integer":false,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","input_name":"Random Scale Bias","range_min":-50.0},"widget_override":"number"},{"input_data":{"tooltip":"Seed to determine unique variations on all the randomized instance sizes","is_integer":true,"blank_assist":true,"min":0.0,"mode":"Increment","input_name":"Random Scale Seed"},"widget_override":"number"},{"input_data":{"min":0.0,"is_integer":false,"unit":"°","blank_assist":true,"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","mode":"Range","input_name":"Random Rotation","max":360.0},"widget_override":"number"},{"input_data":{"min":0.0,"input_name":"Random Rotation Seed","mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance angles","is_integer":true,"blank_assist":true},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[3971837674569123876,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"tooltip":"Artwork to be copied and placed at each point","input_name":"Instance"},"widget_override":null},{"input_data":{"unit":"x","tooltip":"Minimum range of randomized sizes given to each instance","is_integer":false,"input_name":"Random Scale Min","mode":"Range","min":0.0,"range_min":0.0,"range_max":2.0,"blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"range_min":0.0,"unit":"x","min":0.0,"input_name":"Random Scale Max","range_max":2.0,"mode":"Range","tooltip":"Minimum range of randomized sizes given to each instance","blank_assist":true},"widget_override":"number"},{"input_data":{"blank_assist":true,"mode":"Range","is_integer":false,"range_max":50.0,"range_min":-50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","input_name":"Random Scale Bias"},"widget_override":"number"},{"input_data":{"blank_assist":true,"tooltip":"Seed to determine unique variations on all the randomized instance sizes","min":0.0,"mode":"Increment","is_integer":true,"input_name":"Random Scale Seed"},"widget_override":"number"},{"input_data":{"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","max":360.0,"min":0.0,"blank_assist":true,"is_integer":false,"mode":"Range","unit":"°","input_name":"Random Rotation"},"widget_override":"number"},{"input_data":{"is_integer":true,"mode":"Increment","min":0.0,"input_name":"Random Rotation Seed","tooltip":"Seed to determine unique variations on all the randomized instance angles","blank_assist":true},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[1649010831627623835,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","input_name":"Spacing","min":1.0,"blank_assist":true,"is_integer":false,"mode":"Increment","unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":false,"mode":"Increment","blank_assist":true,"min":0.0,"tooltip":"Exclude some distance from the start of the path before the first instance","unit":" px","input_name":"Start Offset"},"widget_override":"number"},{"input_data":{"is_integer":false,"tooltip":"Exclude some distance from the end of the path after the last instance","input_name":"Stop Offset","min":0.0,"unit":" px","blank_assist":true,"mode":"Increment"},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,5]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15466714490303763249,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16767482995096345179,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[17336535036064625290,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"x":"X","y":"Y","input_name":"Translation","unit":" px"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"x":"W","y":"H","input_name":"Scale","unit":"x"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"hidden"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[8934999452649011837,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Absolute":[-17,130]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15239301303367148581,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4577638792388493935,{"persistent_metadata":{"reference":"Merge","display_name":"Head and Neck","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":78}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13014628586360765651,{"persistent_metadata":{"reference":"Merge","display_name":"Dotted Aura","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":6}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[17699121037850769131,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10190227675276560561,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15460109068588328521,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[9271343782272072828,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[6749771744300551215,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10133176481349663495,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11022999329156494369,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"unit":" px","is_integer":false,"input_name":"Spacing","blank_assist":true,"min":1.0,"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","mode":"Increment"},"widget_override":"number"},{"input_data":{"is_integer":false,"mode":"Increment","unit":" px","input_name":"Start Offset","blank_assist":true,"min":0.0,"tooltip":"Exclude some distance from the start of the path before the first instance"},"widget_override":"number"},{"input_data":{"blank_assist":true,"min":0.0,"mode":"Increment","tooltip":"Exclude some distance from the end of the path after the last instance","unit":" px","input_name":"Stop Offset","is_integer":false},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,5]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14035980686649077716,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[10253927692147706615,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"input_name":"Random Scale Min","blank_assist":true,"is_integer":false,"range_max":2.0,"tooltip":"Minimum range of randomized sizes given to each instance","range_min":0.0,"unit":"x","min":0.0,"mode":"Range"},"widget_override":"number"},{"input_data":{"tooltip":"Minimum range of randomized sizes given to each instance","range_max":2.0,"unit":"x","input_name":"Random Scale Max","min":0.0,"mode":"Range","range_min":0.0,"blank_assist":true,"is_integer":false},"widget_override":"number"},{"input_data":{"blank_assist":true,"input_name":"Random Scale Bias","is_integer":false,"range_min":-50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","mode":"Range","range_max":50.0},"widget_override":"number"},{"input_data":{"min":0.0,"blank_assist":true,"mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance sizes","input_name":"Random Scale Seed","is_integer":true},"widget_override":"number"},{"input_data":{"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","is_integer":false,"input_name":"Random Rotation","max":360.0,"unit":"°","blank_assist":true,"mode":"Range","min":0.0},"widget_override":"number"},{"input_data":{"min":0.0,"tooltip":"Seed to determine unique variations on all the randomized instance angles","mode":"Increment","blank_assist":true,"input_name":"Random Rotation Seed","is_integer":true},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[6988349135757634271,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[3627710206997006419,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13557369662261607646,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[1659518581611333812,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16195626650123806176,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4078100635676202528,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16051539163551573193,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[12385950900718181935,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2780251074492832077,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[7026139249717690649,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"blank_assist":true,"unit":" px","is_integer":false,"min":1.0,"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","mode":"Increment","input_name":"Spacing"},"widget_override":"number"},{"input_data":{"blank_assist":true,"is_integer":false,"min":0.0,"mode":"Increment","tooltip":"Exclude some distance from the start of the path before the first instance","input_name":"Start Offset","unit":" px"},"widget_override":"number"},{"input_data":{"min":0.0,"blank_assist":true,"mode":"Increment","tooltip":"Exclude some distance from the end of the path after the last instance","unit":" px","input_name":"Stop Offset","is_integer":false},"widget_override":"number"},{"input_data":{"tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly","input_name":"Adaptive Spacing"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,5]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[17967471489196302183,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4236845268521674740,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14598755603287563819,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[14993053984267866751,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[5302437193964714993,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"tooltip":"Artwork to be copied and placed at each point","input_name":"Instance"},"widget_override":null},{"input_data":{"tooltip":"Minimum range of randomized sizes given to each instance","range_min":0.0,"unit":"x","is_integer":false,"blank_assist":true,"min":0.0,"mode":"Range","range_max":2.0,"input_name":"Random Scale Min"},"widget_override":"number"},{"input_data":{"min":0.0,"range_max":2.0,"blank_assist":true,"mode":"Range","tooltip":"Minimum range of randomized sizes given to each instance","unit":"x","input_name":"Random Scale Max","is_integer":false,"range_min":0.0},"widget_override":"number"},{"input_data":{"mode":"Range","blank_assist":true,"input_name":"Random Scale Bias","range_min":-50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","range_max":50.0,"is_integer":false},"widget_override":"number"},{"input_data":{"min":0.0,"tooltip":"Seed to determine unique variations on all the randomized instance sizes","input_name":"Random Scale Seed","mode":"Increment","is_integer":true,"blank_assist":true},"widget_override":"number"},{"input_data":{"unit":"°","blank_assist":true,"is_integer":false,"min":0.0,"input_name":"Random Rotation","max":360.0,"mode":"Range","tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise"},"widget_override":"number"},{"input_data":{"is_integer":true,"blank_assist":true,"mode":"Increment","input_name":"Random Rotation Seed","min":0.0,"tooltip":"Seed to determine unique variations on all the randomized instance angles"},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[542361600097372754,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2397243911096708995,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16536768589601337644,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[14887821801874852671,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[17364155187784942740,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[1785173043494067496,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14946189826912398678,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[7849528090737558776,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","unit":" px","blank_assist":true,"is_integer":false,"input_name":"Spacing","min":1.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{"unit":" px","is_integer":false,"blank_assist":true,"input_name":"Start Offset","tooltip":"Exclude some distance from the start of the path before the first instance","min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{"unit":" px","input_name":"Stop Offset","mode":"Increment","min":0.0,"blank_assist":true,"is_integer":false,"tooltip":"Exclude some distance from the end of the path after the last instance"},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,5]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14982414026754548178,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"mode":"Range","min":0.0,"blank_assist":true,"input_name":"Random Scale Min","is_integer":false,"tooltip":"Minimum range of randomized sizes given to each instance","range_max":2.0,"range_min":0.0,"unit":"x"},"widget_override":"number"},{"input_data":{"tooltip":"Minimum range of randomized sizes given to each instance","input_name":"Random Scale Max","mode":"Range","unit":"x","range_min":0.0,"is_integer":false,"min":0.0,"blank_assist":true,"range_max":2.0},"widget_override":"number"},{"input_data":{"range_min":-50.0,"blank_assist":true,"range_max":50.0,"input_name":"Random Scale Bias","tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","mode":"Range","is_integer":false},"widget_override":"number"},{"input_data":{"min":0.0,"input_name":"Random Scale Seed","tooltip":"Seed to determine unique variations on all the randomized instance sizes","blank_assist":true,"mode":"Increment","is_integer":true},"widget_override":"number"},{"input_data":{"blank_assist":true,"max":360.0,"unit":"°","min":0.0,"mode":"Range","is_integer":false,"input_name":"Random Rotation","tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise"},"widget_override":"number"},{"input_data":{"min":0.0,"blank_assist":true,"tooltip":"Seed to determine unique variations on all the randomized instance angles","input_name":"Random Rotation Seed","mode":"Increment","is_integer":true},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[9954843247420111867,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"x":"X","unit":" px","y":"Y","input_name":"Translation"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"x":"W","y":"H","unit":"x","input_name":"Scale"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"hidden"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[5278509881589546420,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13302269488061286120,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11464423670065789907,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"blank_assist":true,"tooltip":"Minimum range of randomized sizes given to each instance","range_max":2.0,"is_integer":false,"range_min":0.0,"unit":"x","mode":"Range","input_name":"Random Scale Min","min":0.0},"widget_override":"number"},{"input_data":{"range_min":0.0,"blank_assist":true,"is_integer":false,"input_name":"Random Scale Max","range_max":2.0,"min":0.0,"tooltip":"Minimum range of randomized sizes given to each instance","mode":"Range","unit":"x"},"widget_override":"number"},{"input_data":{"range_min":-50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","mode":"Range","is_integer":false,"range_max":50.0,"blank_assist":true,"input_name":"Random Scale Bias"},"widget_override":"number"},{"input_data":{"blank_assist":true,"min":0.0,"tooltip":"Seed to determine unique variations on all the randomized instance sizes","mode":"Increment","input_name":"Random Scale Seed","is_integer":true},"widget_override":"number"},{"input_data":{"is_integer":false,"unit":"°","input_name":"Random Rotation","min":0.0,"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","max":360.0,"blank_assist":true,"mode":"Range"},"widget_override":"number"},{"input_data":{"tooltip":"Seed to determine unique variations on all the randomized instance angles","input_name":"Random Rotation Seed","min":0.0,"mode":"Increment","is_integer":true,"blank_assist":true},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[6645255982686652881,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16450742929146919960,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[8410534738018320047,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11025165626998987360,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"blank_assist":true,"range_max":2.0,"range_min":0.0,"input_name":"Random Scale Min","is_integer":false,"tooltip":"Minimum range of randomized sizes given to each instance","mode":"Range","unit":"x","min":0.0},"widget_override":"number"},{"input_data":{"mode":"Range","unit":"x","is_integer":false,"range_max":2.0,"input_name":"Random Scale Max","blank_assist":true,"min":0.0,"tooltip":"Minimum range of randomized sizes given to each instance","range_min":0.0},"widget_override":"number"},{"input_data":{"mode":"Range","is_integer":false,"range_max":50.0,"input_name":"Random Scale Bias","range_min":-50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","blank_assist":true},"widget_override":"number"},{"input_data":{"mode":"Increment","is_integer":true,"min":0.0,"blank_assist":true,"tooltip":"Seed to determine unique variations on all the randomized instance sizes","input_name":"Random Scale Seed"},"widget_override":"number"},{"input_data":{"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","input_name":"Random Rotation","unit":"°","is_integer":false,"min":0.0,"max":360.0,"blank_assist":true,"mode":"Range"},"widget_override":"number"},{"input_data":{"min":0.0,"blank_assist":true,"mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance angles","input_name":"Random Rotation Seed","is_integer":true},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[8699675339613677057,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"y":"Y","input_name":"Translation","unit":" px","x":"X"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"y":"H","input_name":"Scale","unit":"x","x":"W"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"hidden"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[1272070255512697108,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[14285767317419627814,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[18190631752493248867,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2368785048463929131,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"unit":" px","input_name":"Spacing","mode":"Increment","blank_assist":true,"is_integer":false,"min":1.0,"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)"},"widget_override":"number"},{"input_data":{"tooltip":"Exclude some distance from the start of the path before the first instance","is_integer":false,"input_name":"Start Offset","blank_assist":true,"min":0.0,"mode":"Increment","unit":" px"},"widget_override":"number"},{"input_data":{"min":0.0,"input_name":"Stop Offset","tooltip":"Exclude some distance from the end of the path after the last instance","blank_assist":true,"is_integer":false,"unit":" px","mode":"Increment"},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,5]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10424806499648491677,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10270446074640675342,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{"unit":" px","x":"X","y":"Y"},"widget_override":"vec2"},{"input_data":{},"widget_override":"transform_rotation"},{"input_data":{"y":"H","x":"W","unit":"x"},"widget_override":"vec2"},{"input_data":{},"widget_override":"transform_skew"},{"input_data":{},"widget_override":"hidden"}],"output_names":["Data"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[5269304445610080925,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"tooltip":"Artwork to be copied and placed at each point","input_name":"Instance"},"widget_override":null},{"input_data":{"range_min":0.0,"mode":"Range","blank_assist":true,"is_integer":false,"min":0.0,"range_max":2.0,"tooltip":"Minimum range of randomized sizes given to each instance","input_name":"Random Scale Min","unit":"x"},"widget_override":"number"},{"input_data":{"tooltip":"Minimum range of randomized sizes given to each instance","is_integer":false,"range_max":2.0,"range_min":0.0,"input_name":"Random Scale Max","min":0.0,"unit":"x","blank_assist":true,"mode":"Range"},"widget_override":"number"},{"input_data":{"mode":"Range","blank_assist":true,"is_integer":false,"range_max":50.0,"range_min":-50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","input_name":"Random Scale Bias"},"widget_override":"number"},{"input_data":{"tooltip":"Seed to determine unique variations on all the randomized instance sizes","mode":"Increment","is_integer":true,"blank_assist":true,"min":0.0,"input_name":"Random Scale Seed"},"widget_override":"number"},{"input_data":{"min":0.0,"max":360.0,"mode":"Range","input_name":"Random Rotation","tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","is_integer":false,"unit":"°","blank_assist":true},"widget_override":"number"},{"input_data":{"mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance angles","blank_assist":true,"input_name":"Random Rotation Seed","is_integer":true,"min":0.0},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[14778750092903591172,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[7747398671834040298,{"persistent_metadata":{"reference":"Scatter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"range_min":1.0,"min":0.01,"blank_assist":true,"input_name":"Separation Disk Diameter","is_integer":false,"mode":"Range","range_max":100.0},"widget_override":"number"},{"input_data":{"mode":"Increment","is_integer":true,"blank_assist":true,"input_name":"Seed","min":0.0},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Poisson-Disk Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[7659717355245331967,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11021243031011826737,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[15303587427289959766,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2478872006455149410,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Spacing","is_integer":false,"min":1.0,"mode":"Increment","tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","blank_assist":true,"unit":" px"},"widget_override":"number"},{"input_data":{"unit":" px","min":0.0,"input_name":"Start Offset","is_integer":false,"blank_assist":true,"tooltip":"Exclude some distance from the start of the path before the first instance","mode":"Increment"},"widget_override":"number"},{"input_data":{"is_integer":false,"mode":"Increment","tooltip":"Exclude some distance from the end of the path after the last instance","min":0.0,"unit":" px","input_name":"Stop Offset","blank_assist":true},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,5]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[17971411534648521628,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[5555007473125503522,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13444661581815146533,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Absolute":[-17,97]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4784708315242877950,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[1806828617441445250,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16290933138334939444,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4787732047489141819,{"persistent_metadata":{"reference":"Merge","display_name":"Tucked Arm","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":24}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[18422317423856403288,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2878992817082507910,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13045087323693407920,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[9371909264427723282,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[6416452251137958677,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"is_integer":false,"min":0.0,"range_max":2.0,"tooltip":"Minimum range of randomized sizes given to each instance","input_name":"Random Scale Min","blank_assist":true,"range_min":0.0,"mode":"Range","unit":"x"},"widget_override":"number"},{"input_data":{"blank_assist":true,"is_integer":false,"mode":"Range","range_min":0.0,"input_name":"Random Scale Max","tooltip":"Minimum range of randomized sizes given to each instance","range_max":2.0,"min":0.0,"unit":"x"},"widget_override":"number"},{"input_data":{"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","is_integer":false,"input_name":"Random Scale Bias","range_min":-50.0,"blank_assist":true,"mode":"Range","range_max":50.0},"widget_override":"number"},{"input_data":{"blank_assist":true,"mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance sizes","is_integer":true,"min":0.0,"input_name":"Random Scale Seed"},"widget_override":"number"},{"input_data":{"max":360.0,"blank_assist":true,"is_integer":false,"min":0.0,"unit":"°","tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","input_name":"Random Rotation","mode":"Range"},"widget_override":"number"},{"input_data":{"mode":"Increment","input_name":"Random Rotation Seed","is_integer":true,"min":0.0,"blank_assist":true,"tooltip":"Seed to determine unique variations on all the randomized instance angles"},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[13014916927589286309,{"persistent_metadata":{"reference":"Scatter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"blank_assist":true,"range_max":100.0,"range_min":1.0,"min":0.01,"mode":"Range","is_integer":false,"input_name":"Separation Disk Diameter"},"widget_override":"number"},{"input_data":{"blank_assist":true,"min":0.0,"is_integer":true,"mode":"Increment","input_name":"Seed"},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Poisson-Disk Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14991324592500870173,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16756940771483104467,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[16324258033206362312,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"tooltip":"Minimum range of randomized sizes given to each instance","range_max":2.0,"blank_assist":true,"is_integer":false,"range_min":0.0,"unit":"x","mode":"Range","input_name":"Random Scale Min","min":0.0},"widget_override":"number"},{"input_data":{"range_max":2.0,"range_min":0.0,"min":0.0,"unit":"x","blank_assist":true,"tooltip":"Minimum range of randomized sizes given to each instance","input_name":"Random Scale Max","is_integer":false,"mode":"Range"},"widget_override":"number"},{"input_data":{"mode":"Range","range_max":50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","range_min":-50.0,"input_name":"Random Scale Bias","is_integer":false,"blank_assist":true},"widget_override":"number"},{"input_data":{"mode":"Increment","is_integer":true,"tooltip":"Seed to determine unique variations on all the randomized instance sizes","min":0.0,"blank_assist":true,"input_name":"Random Scale Seed"},"widget_override":"number"},{"input_data":{"blank_assist":true,"min":0.0,"max":360.0,"input_name":"Random Rotation","is_integer":false,"mode":"Range","unit":"°","tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise"},"widget_override":"number"},{"input_data":{"mode":"Increment","is_integer":true,"tooltip":"Seed to determine unique variations on all the randomized instance angles","input_name":"Random Rotation Seed","min":0.0,"blank_assist":true},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[14345191642063772510,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[1157261387411722141,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[6282972142629473139,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[501401493219507773,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[9740500978584792725,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14817659161913199655,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2175432926627256613,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Absolute":[-17,328]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[7893851488963635918,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4248321400839848160,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Absolute":[-17,124]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16649851742084147477,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[1869448627329502330,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"input_name":"Random Scale Min","is_integer":false,"range_min":0.0,"blank_assist":true,"unit":"x","min":0.0,"mode":"Range","tooltip":"Minimum range of randomized sizes given to each instance","range_max":2.0},"widget_override":"number"},{"input_data":{"range_max":2.0,"blank_assist":true,"mode":"Range","range_min":0.0,"min":0.0,"is_integer":false,"unit":"x","tooltip":"Minimum range of randomized sizes given to each instance","input_name":"Random Scale Max"},"widget_override":"number"},{"input_data":{"input_name":"Random Scale Bias","blank_assist":true,"is_integer":false,"range_min":-50.0,"mode":"Range","range_max":50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)"},"widget_override":"number"},{"input_data":{"min":0.0,"mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance sizes","blank_assist":true,"input_name":"Random Scale Seed","is_integer":true},"widget_override":"number"},{"input_data":{"min":0.0,"blank_assist":true,"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","max":360.0,"is_integer":false,"mode":"Range","unit":"°","input_name":"Random Rotation"},"widget_override":"number"},{"input_data":{"min":0.0,"blank_assist":true,"is_integer":true,"mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance angles","input_name":"Random Rotation Seed"},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[2641530639940889619,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10689298484366290551,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2126710823743005151,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[16796171662855500935,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[6580280438672662494,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13352561089252322209,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[5861306074868809692,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11659756061767599421,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[10415872992231003638,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[13975451746581400000,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11804065810513502701,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[12049041947382267086,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"unit":" px","input_name":"Translation","y":"Y","x":"X"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"input_name":"Scale","unit":"x","x":"W","y":"H"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"hidden"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[17133591775058457007,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"tooltip":"Artwork to be copied and placed at each point","input_name":"Instance"},"widget_override":null},{"input_data":{"input_name":"Random Scale Min","is_integer":false,"min":0.0,"blank_assist":true,"range_max":2.0,"tooltip":"Minimum range of randomized sizes given to each instance","unit":"x","range_min":0.0,"mode":"Range"},"widget_override":"number"},{"input_data":{"mode":"Range","range_max":2.0,"is_integer":false,"min":0.0,"input_name":"Random Scale Max","blank_assist":true,"tooltip":"Minimum range of randomized sizes given to each instance","unit":"x","range_min":0.0},"widget_override":"number"},{"input_data":{"mode":"Range","range_max":50.0,"is_integer":false,"blank_assist":true,"input_name":"Random Scale Bias","range_min":-50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)"},"widget_override":"number"},{"input_data":{"blank_assist":true,"input_name":"Random Scale Seed","mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance sizes","is_integer":true,"min":0.0},"widget_override":"number"},{"input_data":{"input_name":"Random Rotation","min":0.0,"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","unit":"°","is_integer":false,"max":360.0,"mode":"Range","blank_assist":true},"widget_override":"number"},{"input_data":{"tooltip":"Seed to determine unique variations on all the randomized instance angles","is_integer":true,"input_name":"Random Rotation Seed","min":0.0,"mode":"Increment","blank_assist":true},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[12313564802550122052,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13481022631108980683,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[18319784717194273926,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13128371516143508372,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"min":1.0,"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","unit":" px","blank_assist":true,"input_name":"Spacing","is_integer":false,"mode":"Increment"},"widget_override":"number"},{"input_data":{"mode":"Increment","tooltip":"Exclude some distance from the start of the path before the first instance","blank_assist":true,"input_name":"Start Offset","min":0.0,"unit":" px","is_integer":false},"widget_override":"number"},{"input_data":{"tooltip":"Exclude some distance from the end of the path after the last instance","unit":" px","blank_assist":true,"min":0.0,"mode":"Increment","is_integer":false,"input_name":"Stop Offset"},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,5]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13035777574951374461,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11553850607251055696,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13368990606109678244,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[6672826052605647592,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16446146761452576438,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Translation","x":"X","unit":" px","y":"Y"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"input_name":"Scale","unit":"x","x":"W","y":"H"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"hidden"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[8814059393325469059,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11590691579869262546,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[15656854169166220905,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"y":"Y","input_name":"Translation","x":"X","unit":" px"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"x":"W","unit":"x","input_name":"Scale","y":"H"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"hidden"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11451028343967836482,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[3406722917122601552,{"persistent_metadata":{"reference":"Circle","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"Radius"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-38,208]}}},"network_metadata":null}}],[8766106989344197438,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[5140869461760168364,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[17797565855444771977,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"min":1.0,"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","mode":"Increment","unit":" px","blank_assist":true,"input_name":"Spacing","is_integer":false},"widget_override":"number"},{"input_data":{"input_name":"Start Offset","is_integer":false,"blank_assist":true,"tooltip":"Exclude some distance from the start of the path before the first instance","mode":"Increment","min":0.0,"unit":" px"},"widget_override":"number"},{"input_data":{"input_name":"Stop Offset","min":0.0,"is_integer":false,"mode":"Increment","tooltip":"Exclude some distance from the end of the path after the last instance","unit":" px","blank_assist":true},"widget_override":"number"},{"input_data":{"tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly","input_name":"Adaptive Spacing"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,5]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14012583111791538162,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[7385465194555106679,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Absolute":[-17,211]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2087303479944421366,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14012648643507848353,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4577174813962563383,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16756550532943068678,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"mode":"Increment","blank_assist":true,"unit":" px","input_name":"Spacing","is_integer":false,"min":1.0,"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)"},"widget_override":"number"},{"input_data":{"mode":"Increment","blank_assist":true,"input_name":"Start Offset","is_integer":false,"min":0.0,"tooltip":"Exclude some distance from the start of the path before the first instance","unit":" px"},"widget_override":"number"},{"input_data":{"tooltip":"Exclude some distance from the end of the path after the last instance","min":0.0,"blank_assist":true,"mode":"Increment","input_name":"Stop Offset","is_integer":false,"unit":" px"},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,5]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11058365317860779469,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[581013017684525986,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13732749881962071635,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"blank_assist":true,"is_integer":false,"unit":" px","min":1.0,"mode":"Increment","input_name":"Spacing","tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)"},"widget_override":"number"},{"input_data":{"input_name":"Start Offset","is_integer":false,"unit":" px","tooltip":"Exclude some distance from the start of the path before the first instance","mode":"Increment","blank_assist":true,"min":0.0},"widget_override":"number"},{"input_data":{"min":0.0,"tooltip":"Exclude some distance from the end of the path after the last instance","mode":"Increment","unit":" px","is_integer":false,"blank_assist":true,"input_name":"Stop Offset"},"widget_override":"number"},{"input_data":{"tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly","input_name":"Adaptive Spacing"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,5]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10336592647221792772,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[11356586238302409958,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[1162381870526064378,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10375238420217738812,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"unit":"x","input_name":"Random Scale Min","mode":"Range","tooltip":"Minimum range of randomized sizes given to each instance","min":0.0,"blank_assist":true,"range_min":0.0,"is_integer":false,"range_max":2.0},"widget_override":"number"},{"input_data":{"is_integer":false,"range_max":2.0,"mode":"Range","tooltip":"Minimum range of randomized sizes given to each instance","min":0.0,"range_min":0.0,"blank_assist":true,"unit":"x","input_name":"Random Scale Max"},"widget_override":"number"},{"input_data":{"range_max":50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","blank_assist":true,"mode":"Range","is_integer":false,"range_min":-50.0,"input_name":"Random Scale Bias"},"widget_override":"number"},{"input_data":{"input_name":"Random Scale Seed","is_integer":true,"tooltip":"Seed to determine unique variations on all the randomized instance sizes","min":0.0,"mode":"Increment","blank_assist":true},"widget_override":"number"},{"input_data":{"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","max":360.0,"min":0.0,"is_integer":false,"unit":"°","blank_assist":true,"input_name":"Random Rotation","mode":"Range"},"widget_override":"number"},{"input_data":{"tooltip":"Seed to determine unique variations on all the randomized instance angles","input_name":"Random Rotation Seed","blank_assist":true,"is_integer":true,"min":0.0,"mode":"Increment"},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[14225285635863713990,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"unit":" px","x":"X","y":"Y","input_name":"Translation"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"input_name":"Scale","unit":"x","x":"W","y":"H"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"hidden"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10127467043900015225,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[7274163206797151962,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"min":1.0,"mode":"Increment","tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","unit":" px","blank_assist":true,"is_integer":false,"input_name":"Spacing"},"widget_override":"number"},{"input_data":{"is_integer":false,"unit":" px","input_name":"Start Offset","min":0.0,"mode":"Increment","tooltip":"Exclude some distance from the start of the path before the first instance","blank_assist":true},"widget_override":"number"},{"input_data":{"input_name":"Stop Offset","tooltip":"Exclude some distance from the end of the path after the last instance","min":0.0,"blank_assist":true,"unit":" px","is_integer":false,"mode":"Increment"},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,5]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[1689789805659535712,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[18279507457571359732,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[10919570333355604326,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"min":1.0,"is_integer":false,"mode":"Increment","tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","unit":" px","input_name":"Spacing","blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"tooltip":"Exclude some distance from the start of the path before the first instance","blank_assist":true,"unit":" px","min":0.0,"input_name":"Start Offset","mode":"Increment"},"widget_override":"number"},{"input_data":{"mode":"Increment","unit":" px","blank_assist":true,"input_name":"Stop Offset","is_integer":false,"min":0.0,"tooltip":"Exclude some distance from the end of the path after the last instance"},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,5]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2044103368441997753,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14029368390543839187,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[8698602280607307123,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[12219771677493189964,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16530658574540156160,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Translation","unit":" px","y":"Y","x":"X"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"y":"H","unit":"x","x":"W","input_name":"Scale"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"hidden"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13261814586176172586,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4265165189651403984,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11268046366284173800,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[9605881532464442500,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"is_integer":false,"blank_assist":true,"min":1.0,"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","input_name":"Spacing","mode":"Increment","unit":" px"},"widget_override":"number"},{"input_data":{"unit":" px","blank_assist":true,"input_name":"Start Offset","mode":"Increment","tooltip":"Exclude some distance from the start of the path before the first instance","is_integer":false,"min":0.0},"widget_override":"number"},{"input_data":{"mode":"Increment","tooltip":"Exclude some distance from the end of the path after the last instance","is_integer":false,"blank_assist":true,"input_name":"Stop Offset","unit":" px","min":0.0},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,5]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[17426609415699324395,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10928540355449103287,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[421715625023770179,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[907841922684377912,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[8543051864256131356,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"is_integer":false,"min":0.0,"unit":"x","tooltip":"Minimum range of randomized sizes given to each instance","blank_assist":true,"input_name":"Random Scale Min","mode":"Range","range_max":2.0,"range_min":0.0},"widget_override":"number"},{"input_data":{"is_integer":false,"input_name":"Random Scale Max","range_min":0.0,"unit":"x","blank_assist":true,"range_max":2.0,"min":0.0,"mode":"Range","tooltip":"Minimum range of randomized sizes given to each instance"},"widget_override":"number"},{"input_data":{"range_min":-50.0,"blank_assist":true,"input_name":"Random Scale Bias","tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","is_integer":false,"mode":"Range","range_max":50.0},"widget_override":"number"},{"input_data":{"is_integer":true,"min":0.0,"input_name":"Random Scale Seed","blank_assist":true,"tooltip":"Seed to determine unique variations on all the randomized instance sizes","mode":"Increment"},"widget_override":"number"},{"input_data":{"unit":"°","max":360.0,"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","min":0.0,"mode":"Range","is_integer":false,"blank_assist":true,"input_name":"Random Rotation"},"widget_override":"number"},{"input_data":{"mode":"Increment","input_name":"Random Rotation Seed","min":0.0,"tooltip":"Seed to determine unique variations on all the randomized instance angles","is_integer":true,"blank_assist":true},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[9425359632144678256,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[9470742171134780193,{"persistent_metadata":{"reference":"Merge","display_name":"Dotted Skirt","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":81}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[3802858053991775169,{"persistent_metadata":{"reference":"Scatter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"min":0.01,"range_max":100.0,"input_name":"Separation Disk Diameter","range_min":1.0,"mode":"Range","blank_assist":true,"is_integer":false},"widget_override":"number"},{"input_data":{"input_name":"Seed","is_integer":true,"mode":"Increment","min":0.0,"blank_assist":true},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Poisson-Disk Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[12062649793560663566,{"persistent_metadata":{"reference":"Merge","display_name":"Solid Red Skirt","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":3}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[3636653585682494814,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"input_name":"Random Scale Min","range_max":2.0,"range_min":0.0,"tooltip":"Minimum range of randomized sizes given to each instance","min":0.0,"mode":"Range","unit":"x","is_integer":false,"blank_assist":true},"widget_override":"number"},{"input_data":{"mode":"Range","range_max":2.0,"is_integer":false,"input_name":"Random Scale Max","tooltip":"Minimum range of randomized sizes given to each instance","range_min":0.0,"unit":"x","blank_assist":true,"min":0.0},"widget_override":"number"},{"input_data":{"input_name":"Random Scale Bias","is_integer":false,"mode":"Range","blank_assist":true,"range_max":50.0,"range_min":-50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)"},"widget_override":"number"},{"input_data":{"tooltip":"Seed to determine unique variations on all the randomized instance sizes","mode":"Increment","min":0.0,"blank_assist":true,"input_name":"Random Scale Seed","is_integer":true},"widget_override":"number"},{"input_data":{"mode":"Range","max":360.0,"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","blank_assist":true,"min":0.0,"input_name":"Random Rotation","is_integer":false,"unit":"°"},"widget_override":"number"},{"input_data":{"mode":"Increment","blank_assist":true,"tooltip":"Seed to determine unique variations on all the randomized instance angles","is_integer":true,"input_name":"Random Rotation Seed","min":0.0},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[6532401937876437300,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"y":"Y","input_name":"Translation","unit":" px","x":"X"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"unit":"x","input_name":"Scale","x":"W","y":"H"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"hidden"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15126865253122550765,{"persistent_metadata":{"reference":"Merge","display_name":"Dotted Bodice","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":21}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[1384427686127078856,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11616089678400336955,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"tooltip":"Artwork to be copied and placed at each point","input_name":"Instance"},"widget_override":null},{"input_data":{"input_name":"Random Scale Min","unit":"x","blank_assist":true,"range_max":2.0,"tooltip":"Minimum range of randomized sizes given to each instance","mode":"Range","is_integer":false,"min":0.0,"range_min":0.0},"widget_override":"number"},{"input_data":{"is_integer":false,"range_max":2.0,"blank_assist":true,"min":0.0,"range_min":0.0,"mode":"Range","tooltip":"Minimum range of randomized sizes given to each instance","unit":"x","input_name":"Random Scale Max"},"widget_override":"number"},{"input_data":{"mode":"Range","input_name":"Random Scale Bias","range_min":-50.0,"range_max":50.0,"blank_assist":true,"is_integer":false,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)"},"widget_override":"number"},{"input_data":{"tooltip":"Seed to determine unique variations on all the randomized instance sizes","is_integer":true,"mode":"Increment","min":0.0,"blank_assist":true,"input_name":"Random Scale Seed"},"widget_override":"number"},{"input_data":{"is_integer":false,"input_name":"Random Rotation","unit":"°","mode":"Range","max":360.0,"blank_assist":true,"min":0.0,"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise"},"widget_override":"number"},{"input_data":{"blank_assist":true,"is_integer":true,"input_name":"Random Rotation Seed","min":0.0,"mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance angles"},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[4422453582814483232,{"persistent_metadata":{"reference":"Merge","display_name":"Hair and Face","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Absolute":[-7,4]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[9182448229950585507,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[8230694129617719636,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[1889157037801767612,{"persistent_metadata":{"reference":"Scatter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Separation Disk Diameter","is_integer":false,"min":0.01,"range_max":100.0,"mode":"Range","range_min":1.0,"blank_assist":true},"widget_override":"number"},{"input_data":{"min":0.0,"mode":"Increment","blank_assist":true,"input_name":"Seed","is_integer":true},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Poisson-Disk Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[1019037285881657884,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"is_integer":false,"tooltip":"Minimum range of randomized sizes given to each instance","min":0.0,"range_max":2.0,"blank_assist":true,"mode":"Range","unit":"x","range_min":0.0,"input_name":"Random Scale Min"},"widget_override":"number"},{"input_data":{"min":0.0,"unit":"x","input_name":"Random Scale Max","mode":"Range","blank_assist":true,"range_max":2.0,"is_integer":false,"range_min":0.0,"tooltip":"Minimum range of randomized sizes given to each instance"},"widget_override":"number"},{"input_data":{"input_name":"Random Scale Bias","blank_assist":true,"mode":"Range","range_min":-50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","is_integer":false,"range_max":50.0},"widget_override":"number"},{"input_data":{"blank_assist":true,"min":0.0,"mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance sizes","input_name":"Random Scale Seed","is_integer":true},"widget_override":"number"},{"input_data":{"unit":"°","blank_assist":true,"input_name":"Random Rotation","is_integer":false,"max":360.0,"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","mode":"Range","min":0.0},"widget_override":"number"},{"input_data":{"input_name":"Random Rotation Seed","mode":"Increment","min":0.0,"blank_assist":true,"is_integer":true,"tooltip":"Seed to determine unique variations on all the randomized instance angles"},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[10918055532782314571,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"tooltip":"Artwork to be copied and placed at each point","input_name":"Instance"},"widget_override":null},{"input_data":{"blank_assist":true,"unit":"x","range_max":2.0,"mode":"Range","input_name":"Random Scale Min","is_integer":false,"range_min":0.0,"min":0.0,"tooltip":"Minimum range of randomized sizes given to each instance"},"widget_override":"number"},{"input_data":{"blank_assist":true,"range_max":2.0,"mode":"Range","range_min":0.0,"is_integer":false,"tooltip":"Minimum range of randomized sizes given to each instance","unit":"x","input_name":"Random Scale Max","min":0.0},"widget_override":"number"},{"input_data":{"blank_assist":true,"input_name":"Random Scale Bias","is_integer":false,"range_max":50.0,"range_min":-50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","mode":"Range"},"widget_override":"number"},{"input_data":{"is_integer":true,"min":0.0,"mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance sizes","blank_assist":true,"input_name":"Random Scale Seed"},"widget_override":"number"},{"input_data":{"is_integer":false,"input_name":"Random Rotation","mode":"Range","min":0.0,"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","unit":"°","max":360.0,"blank_assist":true},"widget_override":"number"},{"input_data":{"mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance angles","min":0.0,"blank_assist":true,"input_name":"Random Rotation Seed","is_integer":true},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[454416440369338250,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[3226457726231232839,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[12969768453679160567,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"unit":" px","input_name":"Spacing","mode":"Increment","min":1.0,"blank_assist":true,"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","is_integer":false},"widget_override":"number"},{"input_data":{"input_name":"Start Offset","mode":"Increment","blank_assist":true,"min":0.0,"tooltip":"Exclude some distance from the start of the path before the first instance","unit":" px","is_integer":false},"widget_override":"number"},{"input_data":{"min":0.0,"mode":"Increment","input_name":"Stop Offset","unit":" px","tooltip":"Exclude some distance from the end of the path after the last instance","blank_assist":true,"is_integer":false},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,5]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[8413863870096329943,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[17078740291337047697,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-31,208]}}},"network_metadata":null}}],[1500690448497424903,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"unit":" px","is_integer":false,"blank_assist":true,"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","mode":"Increment","input_name":"Spacing","min":1.0},"widget_override":"number"},{"input_data":{"mode":"Increment","is_integer":false,"tooltip":"Exclude some distance from the start of the path before the first instance","unit":" px","blank_assist":true,"input_name":"Start Offset","min":0.0},"widget_override":"number"},{"input_data":{"input_name":"Stop Offset","is_integer":false,"mode":"Increment","blank_assist":true,"tooltip":"Exclude some distance from the end of the path after the last instance","min":0.0,"unit":" px"},"widget_override":"number"},{"input_data":{"tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly","input_name":"Adaptive Spacing"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,5]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[3992858139802231032,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15492651270767932214,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14209241002058525241,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[5002654561220917457,{"persistent_metadata":{"reference":"Scatter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"blank_assist":true,"is_integer":false,"mode":"Range","min":0.01,"range_max":100.0,"input_name":"Separation Disk Diameter","range_min":1.0},"widget_override":"number"},{"input_data":{"input_name":"Seed","is_integer":true,"blank_assist":true,"mode":"Increment","min":0.0},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Poisson-Disk Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[5020096817747898028,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[11199691961479466803,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"tooltip":"Minimum range of randomized sizes given to each instance","is_integer":false,"unit":"x","range_max":2.0,"range_min":0.0,"blank_assist":true,"min":0.0,"mode":"Range","input_name":"Random Scale Min"},"widget_override":"number"},{"input_data":{"unit":"x","min":0.0,"range_min":0.0,"is_integer":false,"blank_assist":true,"range_max":2.0,"tooltip":"Minimum range of randomized sizes given to each instance","input_name":"Random Scale Max","mode":"Range"},"widget_override":"number"},{"input_data":{"range_min":-50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","blank_assist":true,"input_name":"Random Scale Bias","is_integer":false,"mode":"Range","range_max":50.0},"widget_override":"number"},{"input_data":{"blank_assist":true,"mode":"Increment","is_integer":true,"min":0.0,"input_name":"Random Scale Seed","tooltip":"Seed to determine unique variations on all the randomized instance sizes"},"widget_override":"number"},{"input_data":{"blank_assist":true,"unit":"°","max":360.0,"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","min":0.0,"is_integer":false,"mode":"Range","input_name":"Random Rotation"},"widget_override":"number"},{"input_data":{"blank_assist":true,"is_integer":true,"mode":"Increment","input_name":"Random Rotation Seed","min":0.0,"tooltip":"Seed to determine unique variations on all the randomized instance angles"},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[13644138583806412631,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11899713172487274471,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[12880230498984021417,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"min":0.0,"range_max":2.0,"input_name":"Random Scale Min","tooltip":"Minimum range of randomized sizes given to each instance","unit":"x","range_min":0.0,"blank_assist":true,"is_integer":false,"mode":"Range"},"widget_override":"number"},{"input_data":{"unit":"x","range_min":0.0,"min":0.0,"input_name":"Random Scale Max","is_integer":false,"tooltip":"Minimum range of randomized sizes given to each instance","mode":"Range","range_max":2.0,"blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"input_name":"Random Scale Bias","blank_assist":true,"mode":"Range","range_max":50.0,"range_min":-50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)"},"widget_override":"number"},{"input_data":{"min":0.0,"input_name":"Random Scale Seed","mode":"Increment","is_integer":true,"tooltip":"Seed to determine unique variations on all the randomized instance sizes","blank_assist":true},"widget_override":"number"},{"input_data":{"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","input_name":"Random Rotation","blank_assist":true,"max":360.0,"is_integer":false,"min":0.0,"mode":"Range","unit":"°"},"widget_override":"number"},{"input_data":{"mode":"Increment","min":0.0,"tooltip":"Seed to determine unique variations on all the randomized instance angles","blank_assist":true,"input_name":"Random Rotation Seed","is_integer":true},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[17207895962122263432,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"blank_assist":true,"input_name":"Random Scale Min","mode":"Range","min":0.0,"range_min":0.0,"unit":"x","tooltip":"Minimum range of randomized sizes given to each instance","range_max":2.0,"is_integer":false},"widget_override":"number"},{"input_data":{"tooltip":"Minimum range of randomized sizes given to each instance","is_integer":false,"mode":"Range","range_min":0.0,"min":0.0,"unit":"x","blank_assist":true,"input_name":"Random Scale Max","range_max":2.0},"widget_override":"number"},{"input_data":{"mode":"Range","input_name":"Random Scale Bias","range_max":50.0,"blank_assist":true,"is_integer":false,"range_min":-50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)"},"widget_override":"number"},{"input_data":{"min":0.0,"blank_assist":true,"mode":"Increment","input_name":"Random Scale Seed","is_integer":true,"tooltip":"Seed to determine unique variations on all the randomized instance sizes"},"widget_override":"number"},{"input_data":{"input_name":"Random Rotation","tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","blank_assist":true,"is_integer":false,"mode":"Range","unit":"°","min":0.0,"max":360.0},"widget_override":"number"},{"input_data":{"is_integer":true,"input_name":"Random Rotation Seed","min":0.0,"blank_assist":true,"mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance angles"},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[5040278174920511484,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[16614450796751955858,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15735375935164094402,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[3670529450440935325,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[1167210731467447244,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14356371986281920306,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Spacing","is_integer":false,"min":1.0,"mode":"Increment","blank_assist":true,"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"input_name":"Start Offset","min":0.0,"mode":"Increment","tooltip":"Exclude some distance from the start of the path before the first instance","unit":" px"},"widget_override":"number"},{"input_data":{"min":0.0,"mode":"Increment","tooltip":"Exclude some distance from the end of the path after the last instance","unit":" px","blank_assist":true,"input_name":"Stop Offset","is_integer":false},"widget_override":"number"},{"input_data":{"tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly","input_name":"Adaptive Spacing"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,5]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[12554368619682347699,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"mode":"Range","min":0.0,"range_max":2.0,"unit":"x","blank_assist":true,"input_name":"Random Scale Min","is_integer":false,"range_min":0.0,"tooltip":"Minimum range of randomized sizes given to each instance"},"widget_override":"number"},{"input_data":{"blank_assist":true,"range_max":2.0,"is_integer":false,"input_name":"Random Scale Max","min":0.0,"unit":"x","mode":"Range","tooltip":"Minimum range of randomized sizes given to each instance","range_min":0.0},"widget_override":"number"},{"input_data":{"range_max":50.0,"mode":"Range","range_min":-50.0,"input_name":"Random Scale Bias","is_integer":false,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","blank_assist":true},"widget_override":"number"},{"input_data":{"mode":"Increment","blank_assist":true,"tooltip":"Seed to determine unique variations on all the randomized instance sizes","is_integer":true,"min":0.0,"input_name":"Random Scale Seed"},"widget_override":"number"},{"input_data":{"unit":"°","max":360.0,"input_name":"Random Rotation","tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","mode":"Range","is_integer":false,"blank_assist":true,"min":0.0},"widget_override":"number"},{"input_data":{"input_name":"Random Rotation Seed","is_integer":true,"tooltip":"Seed to determine unique variations on all the randomized instance angles","mode":"Increment","blank_assist":true,"min":0.0},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[15038739378867834454,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13529118918690401241,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","unit":" px","min":1.0,"mode":"Increment","blank_assist":true,"input_name":"Spacing","is_integer":false},"widget_override":"number"},{"input_data":{"min":0.0,"tooltip":"Exclude some distance from the start of the path before the first instance","unit":" px","blank_assist":true,"mode":"Increment","input_name":"Start Offset","is_integer":false},"widget_override":"number"},{"input_data":{"input_name":"Stop Offset","is_integer":false,"blank_assist":true,"min":0.0,"mode":"Increment","tooltip":"Exclude some distance from the end of the path after the last instance","unit":" px"},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,5]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4350324834849900949,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[2682920349304670808,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2422139482859833437,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[431994205232245356,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Absolute":[-17,7]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[3887089796766124876,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","blank_assist":true,"min":1.0,"mode":"Increment","is_integer":false,"unit":" px","input_name":"Spacing"},"widget_override":"number"},{"input_data":{"blank_assist":true,"input_name":"Start Offset","is_integer":false,"tooltip":"Exclude some distance from the start of the path before the first instance","mode":"Increment","min":0.0,"unit":" px"},"widget_override":"number"},{"input_data":{"mode":"Increment","tooltip":"Exclude some distance from the end of the path after the last instance","blank_assist":true,"unit":" px","input_name":"Stop Offset","min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{"tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly","input_name":"Adaptive Spacing"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,5]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[17118107476414252025,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"y":"Y","input_name":"Translation","x":"X","unit":" px"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"x":"W","y":"H","input_name":"Scale","unit":"x"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"hidden"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[615144098061106242,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[11666664915283969027,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14883504161508594099,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Absolute":[-17,295]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10432831427187785843,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[6867142265138950838,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[4832236468224231783,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16805628435335819723,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[13269760558336088742,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[17239674500639890523,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"mode":"Increment","min":1.0,"input_name":"Spacing","blank_assist":true,"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","is_integer":false,"unit":" px"},"widget_override":"number"},{"input_data":{"blank_assist":true,"min":0.0,"input_name":"Start Offset","is_integer":false,"mode":"Increment","tooltip":"Exclude some distance from the start of the path before the first instance","unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":false,"min":0.0,"mode":"Increment","blank_assist":true,"input_name":"Stop Offset","tooltip":"Exclude some distance from the end of the path after the last instance","unit":" px"},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,5]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[6973438081601736688,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[10514847656270897393,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[7525593029671097583,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[1713644030979611623,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13045580349734858212,{"persistent_metadata":{"reference":"Scatter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"blank_assist":true,"is_integer":false,"min":0.01,"mode":"Range","range_max":100.0,"range_min":1.0,"input_name":"Separation Disk Diameter"},"widget_override":"number"},{"input_data":{"input_name":"Seed","mode":"Increment","blank_assist":true,"is_integer":true,"min":0.0},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Poisson-Disk Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11630078441485655672,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10264089084180279094,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"mode":"Range","input_name":"Random Scale Min","range_max":2.0,"unit":"x","is_integer":false,"min":0.0,"range_min":0.0,"blank_assist":true,"tooltip":"Minimum range of randomized sizes given to each instance"},"widget_override":"number"},{"input_data":{"min":0.0,"mode":"Range","tooltip":"Minimum range of randomized sizes given to each instance","is_integer":false,"range_max":2.0,"blank_assist":true,"range_min":0.0,"input_name":"Random Scale Max","unit":"x"},"widget_override":"number"},{"input_data":{"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","is_integer":false,"range_max":50.0,"input_name":"Random Scale Bias","range_min":-50.0,"mode":"Range","blank_assist":true},"widget_override":"number"},{"input_data":{"input_name":"Random Scale Seed","min":0.0,"mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance sizes","blank_assist":true,"is_integer":true},"widget_override":"number"},{"input_data":{"min":0.0,"mode":"Range","tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","unit":"°","blank_assist":true,"input_name":"Random Rotation","is_integer":false,"max":360.0},"widget_override":"number"},{"input_data":{"tooltip":"Seed to determine unique variations on all the randomized instance angles","blank_assist":true,"is_integer":true,"min":0.0,"input_name":"Random Rotation Seed","mode":"Increment"},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[11677503666435782605,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[5213978458941436169,{"persistent_metadata":{"reference":"Scatter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"blank_assist":true,"mode":"Range","range_min":1.0,"range_max":100.0,"input_name":"Separation Disk Diameter","min":0.01,"is_integer":false},"widget_override":"number"},{"input_data":{"blank_assist":true,"input_name":"Seed","mode":"Increment","is_integer":true,"min":0.0},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Poisson-Disk Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2183999005109815989,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"mode":"Increment","unit":" px","tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","is_integer":false,"blank_assist":true,"min":1.0,"input_name":"Spacing"},"widget_override":"number"},{"input_data":{"min":0.0,"tooltip":"Exclude some distance from the start of the path before the first instance","input_name":"Start Offset","is_integer":false,"blank_assist":true,"mode":"Increment","unit":" px"},"widget_override":"number"},{"input_data":{"mode":"Increment","min":0.0,"input_name":"Stop Offset","tooltip":"Exclude some distance from the end of the path after the last instance","unit":" px","is_integer":false,"blank_assist":true},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,5]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[12761901161949743155,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[17815494794630739611,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[16137033772363318157,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15286091228862934481,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15395954548128560685,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14797986717815207528,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[952330505278607301,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[10587073897090054035,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[17819505448204350775,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","unit":" px","input_name":"Spacing","min":1.0,"mode":"Increment","blank_assist":true,"is_integer":false},"widget_override":"number"},{"input_data":{"input_name":"Start Offset","is_integer":false,"min":0.0,"blank_assist":true,"mode":"Increment","tooltip":"Exclude some distance from the start of the path before the first instance","unit":" px"},"widget_override":"number"},{"input_data":{"unit":" px","blank_assist":true,"is_integer":false,"tooltip":"Exclude some distance from the end of the path after the last instance","min":0.0,"input_name":"Stop Offset","mode":"Increment"},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,5]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4307303572241320716,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Absolute":[-17,319]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[12876462860151722087,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[17945736750161448391,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[7505360855062237520,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[4372998635946271235,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14079496619264986678,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[12030171742672119253,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"min":0.0,"mode":"Range","is_integer":false,"range_max":2.0,"range_min":0.0,"input_name":"Random Scale Min","blank_assist":true,"tooltip":"Minimum range of randomized sizes given to each instance","unit":"x"},"widget_override":"number"},{"input_data":{"blank_assist":true,"range_max":2.0,"tooltip":"Minimum range of randomized sizes given to each instance","mode":"Range","input_name":"Random Scale Max","is_integer":false,"min":0.0,"range_min":0.0,"unit":"x"},"widget_override":"number"},{"input_data":{"range_max":50.0,"range_min":-50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","is_integer":false,"input_name":"Random Scale Bias","blank_assist":true,"mode":"Range"},"widget_override":"number"},{"input_data":{"mode":"Increment","blank_assist":true,"tooltip":"Seed to determine unique variations on all the randomized instance sizes","is_integer":true,"input_name":"Random Scale Seed","min":0.0},"widget_override":"number"},{"input_data":{"min":0.0,"is_integer":false,"unit":"°","blank_assist":true,"input_name":"Random Rotation","tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","mode":"Range","max":360.0},"widget_override":"number"},{"input_data":{"is_integer":true,"mode":"Increment","blank_assist":true,"min":0.0,"tooltip":"Seed to determine unique variations on all the randomized instance angles","input_name":"Random Rotation Seed"},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[8091904580702893317,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[12387541320114693418,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[18015048324114736039,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15637103575662751567,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[8240895922641772563,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[10792166025753022402,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[17529660518597229229,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"unit":"x","range_min":0.0,"min":0.0,"blank_assist":true,"input_name":"Random Scale Min","mode":"Range","range_max":2.0,"is_integer":false,"tooltip":"Minimum range of randomized sizes given to each instance"},"widget_override":"number"},{"input_data":{"range_min":0.0,"min":0.0,"mode":"Range","blank_assist":true,"range_max":2.0,"tooltip":"Minimum range of randomized sizes given to each instance","unit":"x","is_integer":false,"input_name":"Random Scale Max"},"widget_override":"number"},{"input_data":{"is_integer":false,"range_max":50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","mode":"Range","input_name":"Random Scale Bias","blank_assist":true,"range_min":-50.0},"widget_override":"number"},{"input_data":{"input_name":"Random Scale Seed","min":0.0,"mode":"Increment","blank_assist":true,"tooltip":"Seed to determine unique variations on all the randomized instance sizes","is_integer":true},"widget_override":"number"},{"input_data":{"max":360.0,"min":0.0,"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","mode":"Range","is_integer":false,"unit":"°","input_name":"Random Rotation","blank_assist":true},"widget_override":"number"},{"input_data":{"tooltip":"Seed to determine unique variations on all the randomized instance angles","is_integer":true,"min":0.0,"input_name":"Random Rotation Seed","mode":"Increment","blank_assist":true},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[15961046538654083626,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"tooltip":"Artwork to be copied and placed at each point","input_name":"Instance"},"widget_override":null},{"input_data":{"tooltip":"Minimum range of randomized sizes given to each instance","mode":"Range","unit":"x","range_min":0.0,"range_max":2.0,"min":0.0,"input_name":"Random Scale Min","blank_assist":true,"is_integer":false},"widget_override":"number"},{"input_data":{"blank_assist":true,"range_min":0.0,"is_integer":false,"unit":"x","range_max":2.0,"input_name":"Random Scale Max","mode":"Range","min":0.0,"tooltip":"Minimum range of randomized sizes given to each instance"},"widget_override":"number"},{"input_data":{"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","is_integer":false,"blank_assist":true,"input_name":"Random Scale Bias","mode":"Range","range_max":50.0,"range_min":-50.0},"widget_override":"number"},{"input_data":{"mode":"Increment","blank_assist":true,"is_integer":true,"min":0.0,"input_name":"Random Scale Seed","tooltip":"Seed to determine unique variations on all the randomized instance sizes"},"widget_override":"number"},{"input_data":{"blank_assist":true,"min":0.0,"mode":"Range","unit":"°","max":360.0,"is_integer":false,"input_name":"Random Rotation","tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise"},"widget_override":"number"},{"input_data":{"input_name":"Random Rotation Seed","min":0.0,"mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance angles","blank_assist":true,"is_integer":true},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[15815816861435910950,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13231685386999438557,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[17378885078543074499,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[9276497172451351253,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15982852655074258238,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[9529195152569434392,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[9778375740427894463,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[14057307926677215422,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[12473080738469616517,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[3955326429435439190,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"tooltip":"Artwork to be copied and placed at each point","input_name":"Instance"},"widget_override":null},{"input_data":{"input_name":"Random Scale Min","is_integer":false,"tooltip":"Minimum range of randomized sizes given to each instance","blank_assist":true,"mode":"Range","range_min":0.0,"unit":"x","min":0.0,"range_max":2.0},"widget_override":"number"},{"input_data":{"is_integer":false,"input_name":"Random Scale Max","range_max":2.0,"tooltip":"Minimum range of randomized sizes given to each instance","mode":"Range","min":0.0,"blank_assist":true,"unit":"x","range_min":0.0},"widget_override":"number"},{"input_data":{"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","mode":"Range","range_max":50.0,"range_min":-50.0,"blank_assist":true,"input_name":"Random Scale Bias","is_integer":false},"widget_override":"number"},{"input_data":{"mode":"Increment","blank_assist":true,"min":0.0,"is_integer":true,"input_name":"Random Scale Seed","tooltip":"Seed to determine unique variations on all the randomized instance sizes"},"widget_override":"number"},{"input_data":{"blank_assist":true,"input_name":"Random Rotation","max":360.0,"min":0.0,"unit":"°","tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","is_integer":false,"mode":"Range"},"widget_override":"number"},{"input_data":{"blank_assist":true,"tooltip":"Seed to determine unique variations on all the randomized instance angles","is_integer":true,"min":0.0,"mode":"Increment","input_name":"Random Rotation Seed"},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[7472360693015927574,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"min":1.0,"input_name":"Spacing","blank_assist":true,"unit":" px","is_integer":false,"mode":"Increment","tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)"},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"mode":"Increment","unit":" px","input_name":"Start Offset","min":0.0,"tooltip":"Exclude some distance from the start of the path before the first instance"},"widget_override":"number"},{"input_data":{"tooltip":"Exclude some distance from the end of the path after the last instance","blank_assist":true,"is_integer":false,"unit":" px","min":0.0,"input_name":"Stop Offset","mode":"Increment"},"widget_override":"number"},{"input_data":{"tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly","input_name":"Adaptive Spacing"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,5]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2698266912167150713,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[10421722418968896452,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10599660455959346550,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2394762731964337494,{"persistent_metadata":{"reference":"Artboard","display_name":"","input_properties":[{"input_data":{"input_name":"Artboards"},"widget_override":null},{"input_data":{"input_name":"Contents"},"widget_override":"hidden"},{"input_data":{"x":"X","input_name":"Location","unit":" px","y":"Y"},"widget_override":"vec2"},{"input_data":{"unit":" px","x":"W","y":"H","input_name":"Dimensions"},"widget_override":"vec2"},{"input_data":{"input_name":"Background"},"widget_override":"artboard_background"},{"input_data":{"input_name":"Clip"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Absolute":[-3,1]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Artboard","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-10,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-2,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Append Artboards","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[6,-4]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15896921950407486754,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11656581020969095354,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16339345235172368839,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[15518174914032911052,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14675232891471617236,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15446793500614592278,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11610326709040542828,{"persistent_metadata":{"reference":"Sample Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"blank_assist":true,"unit":" px","input_name":"Spacing","min":1.0,"tooltip":"Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)","mode":"Increment","is_integer":false},"widget_override":"number"},{"input_data":{"unit":" px","tooltip":"Exclude some distance from the start of the path before the first instance","is_integer":false,"blank_assist":true,"input_name":"Start Offset","min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{"mode":"Increment","min":0.0,"unit":" px","input_name":"Stop Offset","is_integer":false,"tooltip":"Exclude some distance from the end of the path after the last instance","blank_assist":true},"widget_override":"number"},{"input_data":{"input_name":"Adaptive Spacing","tooltip":"Round 'Spacing' to a nearby value that divides into the path length evenly"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,5]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4222034829755771252,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[737.4067596403,-7171.692081999697],"tilt":0.0,"zoom":0.6328125,"flip":false},"node_graph_to_viewport":[0.6328125,0.0,0.0,0.6328125,1457.0,-3957.0],"node_graph_top_right":[1980.800048828125,0.0]},"selection_undo_history":[[3457800614598085282],[17426704671299246894],[2699408592782313690],[4493274523708782092],[14031411536409518176],[13263961817794116841],[835795066714655983],[11477846841203274509],[727544715487174952],[6480666310383891203],[15086626938904467381],[12994398686940961368],[15086626938904467381],[],[12994398686940961368],[],[5140869461760168364],[11677503666435782605],[776454851019809551],[],[10662978266497754900],[],[13201515093260842314],[],[3932608775253338292],[],[8090442493082590595],[],[17545135276965178247],[4332145463108161926],[],[4332145463108161926],[],[4332145463108161926],[],[11356586238302409958,10086073308516686449],[],[4332145463108161926],[],[3406722917122601552],[4332145463108161926],[],[4332145463108161926],[],[10086073308516686449],[17545135276965178247],[],[17078740291337047697],[3457800614598085282],[3457800614598085282,17426704671299246894],[3457800614598085282,17426704671299246894,2699408592782313690],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,15239301303367148581],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,15239301303367148581,13263961817794116841],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,15239301303367148581,13263961817794116841],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509,727544715487174952],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509,727544715487174952,6480666310383891203],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509,727544715487174952,6480666310383891203,10550662778443296023],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509,727544715487174952,6480666310383891203,10550662778443296023,13185163654003144011],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509,727544715487174952,6480666310383891203,10550662778443296023,13185163654003144011,3559656994078944914],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509,727544715487174952,6480666310383891203,10550662778443296023,13185163654003144011,3559656994078944914,12747708470463124971],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509,727544715487174952,6480666310383891203,10550662778443296023,13185163654003144011,3559656994078944914,12747708470463124971,898580338082782932],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509,727544715487174952,6480666310383891203,10550662778443296023,13185163654003144011,3559656994078944914,12747708470463124971,898580338082782932,17099718003896986529],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509,727544715487174952,6480666310383891203,10550662778443296023,13185163654003144011,3559656994078944914,12747708470463124971,898580338082782932,17099718003896986529,1510915657479425828],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509,727544715487174952,6480666310383891203,10550662778443296023,13185163654003144011,3559656994078944914,12747708470463124971,898580338082782932,17099718003896986529,1510915657479425828,770786980744949903],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509,727544715487174952,6480666310383891203,10550662778443296023,13185163654003144011,3559656994078944914,12747708470463124971,898580338082782932,17099718003896986529,1510915657479425828,770786980744949903,5742628441455317378],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509,727544715487174952,6480666310383891203,10550662778443296023,13185163654003144011,3559656994078944914,12747708470463124971,898580338082782932,17099718003896986529,1510915657479425828,770786980744949903,5742628441455317378,12579808169500774530],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509,727544715487174952,6480666310383891203,10550662778443296023,13185163654003144011,3559656994078944914,12747708470463124971,898580338082782932,17099718003896986529,1510915657479425828,770786980744949903,5742628441455317378,12579808169500774530,862014397356527450],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509,727544715487174952,6480666310383891203,10550662778443296023,13185163654003144011,3559656994078944914,12747708470463124971,898580338082782932,17099718003896986529,1510915657479425828,770786980744949903,5742628441455317378,12579808169500774530,862014397356527450,13790235862723082076],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509,727544715487174952,6480666310383891203,10550662778443296023,13185163654003144011,3559656994078944914,12747708470463124971,898580338082782932,17099718003896986529,1510915657479425828,770786980744949903,5742628441455317378,12579808169500774530,862014397356527450,13790235862723082076,9531720291230511752],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509,727544715487174952,6480666310383891203,10550662778443296023,13185163654003144011,3559656994078944914,12747708470463124971,898580338082782932,17099718003896986529,1510915657479425828,770786980744949903,5742628441455317378,12579808169500774530,862014397356527450,13790235862723082076,9531720291230511752,12792838691218304039],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509,727544715487174952,6480666310383891203,10550662778443296023,13185163654003144011,3559656994078944914,12747708470463124971,898580338082782932,17099718003896986529,1510915657479425828,770786980744949903,5742628441455317378,12579808169500774530,862014397356527450,13790235862723082076,9531720291230511752,12792838691218304039,5102308641931177440],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509,727544715487174952,6480666310383891203,10550662778443296023,13185163654003144011,3559656994078944914,12747708470463124971,898580338082782932,17099718003896986529,1510915657479425828,770786980744949903,5742628441455317378,12579808169500774530,862014397356527450,13790235862723082076,9531720291230511752,12792838691218304039,5102308641931177440,14480644719732559657],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509,727544715487174952,6480666310383891203,10550662778443296023,13185163654003144011,3559656994078944914,12747708470463124971,898580338082782932,17099718003896986529,1510915657479425828,770786980744949903,5742628441455317378,12579808169500774530,862014397356527450,13790235862723082076,9531720291230511752,12792838691218304039,5102308641931177440,14480644719732559657,3601587624047636241],[],[17078740291337047697],[3406722917122601552],[],[9470742171134780193],[14883504161508594099],[],[13163272246010991228],[],[4332145463108161926],[17078740291337047697],[],[],[17078740291337047697,3406722917122601552],[],[9470742171134780193],[13368990606109678244],[9470742171134780193],[14883504161508594099],[421715625023770179],[3670529450440935325],[4265165189651403984],[]],"selection_redo_history":[]}}},"collapsed":[4422453582814483233,4577638792388493936,3170924135668664008,4787732047489141820,12062649793560663567,5455777299776842372,9470742171134780194,15126865253122550766,13014628586360765652],"name":"Red Dress","commit_hash":"8fa46ba63a69bb5fa18a49194cf112d963a2d43b","document_ptz":{"pan":[-512.5,-515.648496025349],"tilt":0.0,"zoom":1.0,"flip":false},"document_mode":"DesignMode","view_mode":"Normal","overlays_visibility_settings":{"all":true,"artboard_name":true,"compass_rose":true,"quick_measurement":true,"transform_measurement":true,"transform_cage":true,"hover_outline":true,"selection_outline":true,"pivot":true,"path":true,"anchors":true,"handles":true},"rulers_visible":true,"snapping_state":{"snapping_enabled":false,"grid_snapping":false,"artboards":true,"tolerance":8.0,"bounding_box":{"center_point":true,"corner_point":true,"edge_midpoint":true,"align_with_edges":true,"distribute_evenly":true},"path":{"anchor_point":true,"line_midpoint":true,"along_path":true,"normal_to_path":true,"tangent_to_path":true,"path_intersection_point":true,"align_with_anchor_point":true,"perpendicular_from_endpoint":true},"grid":{"origin":[0.0,0.0],"grid_type":{"Rectangular":{"spacing":[1.0,1.0]}},"grid_color":{"red":0.6038274,"green":0.6038274,"blue":0.6038274,"alpha":1.0},"dot_display":false}},"graph_view_overlay_open":false,"graph_fade_artwork_percentage":80.0} \ No newline at end of file +{"network_interface":{"network":{"exports":[{"Node":{"node_id":2394762731964337494,"output_index":0,"lambda":false}}],"nodes":[[10127467043900015225,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2],"remove":[],"delta":[[1,[258.00000000000006,994.6666666666664]],[2,[644.0,726.6666666666666]]]},"segments":{"add":[1],"remove":[],"start_point":[[1,1]],"end_point":[[1,2]],"handle_primary":[[1,[0.0,0.0]]],"handle_end":[[1,[-328.66666666666674,129.33333333333337]]],"stroke":[[1,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15961046538654083626,{"inputs":[{"Node":{"node_id":1889157037801767612,"output_index":0,"lambda":false}},{"Node":{"node_id":4332145463108161926,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":0.5},"exposed":false}},{"Value":{"tagged_value":{"F64":10.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[17378885078543074499,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7,8],"remove":[],"delta":[[1,[823.2222222222221,660.4444444444445]],[2,[745.5,826.0]],[5,[740.4444444444443,857.1111111111111]],[4,[709.5555555555554,1026.6666666666667]],[6,[725.7777777777779,1026.370370370371]],[7,[727.5555555555554,1026.6666666666663]],[8,[746.0000000000001,842.9999999999999]],[3,[707.5,1026.5]]]},"segments":{"add":[1,2,3,4,5,6,7,8],"remove":[],"start_point":[[2,2],[4,4],[8,8],[1,1],[3,3],[7,7],[6,6],[5,5]],"end_point":[[7,8],[4,5],[8,1],[2,3],[1,2],[3,4],[5,6],[6,7]],"handle_primary":[[8,[17.33333333333337,-84.99999999999989]],[5,[0.0,0.0]],[4,[0.0,0.0]],[2,[-24.5,85.0]],[1,[0.0,0.0]],[6,[0.0,0.0]],[3,[0.0,0.0]],[7,[0.0,0.0]]],"handle_end":[[3,[0.0,0.0]],[8,[1.772016460905547,0.9591220850479658]],[2,[0.0,0.0]],[1,[24.5,-85.0]],[4,[-23.11111111111109,90.44444444444456]],[6,[0.0,0.0]],[7,[-26.8034437596026,131.4399645903585]],[5,[-7.555555555555884,-59.25925925925992]]],"stroke":[[4,0],[7,0],[8,0],[5,0],[6,0],[2,0],[3,0],[1,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":8}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14537754528543289381,{"inputs":[{"Node":{"node_id":1689789805659535712,"output_index":0,"lambda":false}},{"Node":{"node_id":17364155187784942740,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11656581020969095354,{"inputs":[{"Node":{"node_id":8413863870096329943,"output_index":0,"lambda":false}},{"Node":{"node_id":9698363115186534174,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4350324834849900949,{"inputs":[{"Node":{"node_id":6672826052605647592,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[15857077552290328068,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[1,[848.8888888888889,330.66666666666663]],[4,[702.2222222222222,621.3333333333333]],[2,[820.8888888888889,395.55555555555554]],[3,[740.0,516.0]]]},"segments":{"add":[1,2,3],"remove":[],"start_point":[[3,3],[2,2],[1,1]],"end_point":[[1,2],[2,3],[3,4]],"handle_primary":[[1,[0.0,0.0]],[2,[-15.111111111111086,22.66666666666663]],[3,[-17.77777777777783,35.55555555555554]]],"handle_end":[[2,[17.77777777777783,-35.55555555555554]],[1,[15.111111111111086,-22.66666666666663]],[3,[6.222222222222172,-38.66666666666674]]],"stroke":[[3,0],[2,0],[1,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15735375935164094402,{"inputs":[{"Node":{"node_id":3414873131936208778,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[15239301303367148581,{"inputs":[{"Node":{"node_id":11268046366284173800,"output_index":0,"lambda":false}},{"Node":{"node_id":5269304445610080925,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[615144098061106242,{"inputs":[{"Node":{"node_id":14675232891471617236,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.84705883,"green":0.5372549,"blue":0.38431373,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.84705883,"green":0.5372549,"blue":0.38431373,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[11058365317860779469,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7],"remove":[],"delta":[[4,[397.3333333333333,770.6666666666666]],[6,[368.0,902.6666666666669]],[1,[181.0,1023.0]],[2,[242.0,917.0]],[5,[479.00000000000006,817.0]],[7,[311.3333333333333,1018.6666666666666]],[3,[352.0,833.0]]]},"segments":{"add":[1,2,3,4,5,6,7],"remove":[],"start_point":[[5,5],[1,1],[2,2],[3,3],[4,4],[7,7],[6,6]],"end_point":[[2,3],[1,2],[4,5],[3,4],[6,7],[5,6],[7,1]],"handle_primary":[[5,[-35.31654570364651,23.463149348287175]],[4,[0.0,0.0]],[3,[37.4110841377784,-16.935189837826556]],[2,[40.0718943376238,-39.16116946631416]],[1,[0.0,0.0]],[6,[0.0,0.0]],[7,[0.0,0.0]]],"handle_end":[[4,[35.31654570364611,-23.463149348286947]],[1,[-40.071894337623746,39.16116946631416]],[3,[0.0,0.0]],[5,[45.99999999999994,-52.00000000000023]],[7,[0.0,1.3333333333337123]],[2,[-37.4110841377784,16.935189837826556]],[6,[18.0,-55.33333333333326]]],"stroke":[[1,0],[3,0],[2,0],[7,0],[6,0],[4,0],[5,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":7}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14946189826912398678,{"inputs":[{"Node":{"node_id":10086073308516686449,"output_index":0,"lambda":false}},{"Node":{"node_id":12030171742672119253,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11553850607251055696,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7,8],"remove":[],"delta":[[1,[597.5967078189302,96.04389574759946]],[3,[594.085048010974,128.61454046639233]],[4,[608.570644718793,131.2482853223594]],[6,[609.9753086419754,133.5308641975309]],[2,[596.631001371742,112.37311385459536]],[5,[619.2812071330591,124.6639231824417]],[7,[591.5390946502059,128.7023319615912]],[8,[594.962962962963,111.93415637860085]]]},"segments":{"add":[1,2,3,4,5,6,7,8],"remove":[],"start_point":[[4,4],[2,2],[3,3],[1,1],[7,7],[6,6],[5,5],[8,8]],"end_point":[[6,7],[1,2],[4,5],[2,3],[3,4],[5,6],[7,8],[8,1]],"handle_primary":[[3,[3.5534615822588194,4.6302681223374975]],[8,[4.1262002743484345,-6.935528120713329]],[2,[-4.126200274348321,7.1111111111111]],[7,[-2.3703703703704377,-6.057613168724245]],[4,[4.038408779149563,-1.492455418381354]],[5,[0.0,0.0]],[6,[-7.286694101508829,3.0727023319615796]],[1,[0.0,0.0]]],"handle_end":[[6,[2.3703703703704377,6.057613168724259]],[2,[-2.8971193415636662,-3.7750342935528063]],[3,[-4.038408779149563,1.492455418381354]],[7,[-4.1262002743484345,6.935528120713272]],[1,[4.126200274348321,-7.111111111111114]],[4,[0.0,0.0]],[8,[-0.0877914951989851,0.08779149519889984]],[5,[7.286694101508829,-3.0727023319615796]]],"stroke":[[4,0],[6,0],[7,0],[1,0],[5,0],[3,0],[8,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":8}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4453139144069993994,{"inputs":[{"Node":{"node_id":11804065810513502701,"output_index":0,"lambda":false}},{"Node":{"node_id":3955326429435439190,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[5040278174920511484,{"inputs":[{"Node":{"node_id":14345191642063772510,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[4577174813962563383,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[1,[681.3689965686843,65.32157692417977]],[3,[682.7287205627164,97.04177207029592]],[4,[683.6813083078299,66.11925839089211]],[2,[681.8346756482305,95.35045043533154]]]},"segments":{"add":[1,2,3,4],"remove":[],"start_point":[[3,3],[2,2],[1,1],[4,4]],"end_point":[[4,1],[1,2],[3,4],[2,3]],"handle_primary":[[4,[-1.0406539360374154,-1.1405457962673182]],[3,[-1.544754703853414,-12.605862910106907]],[2,[0.0,0.0]],[1,[0.0,0.0]]],"handle_end":[[2,[-0.5302752037773644,-0.69223185792994]],[1,[-2.6406503472093164,-12.592334294499352]],[4,[-1.1368683772161605e-13,-1.4210854715202004e-14]],[3,null]],"stroke":[[3,0],[2,0],[1,0],[4,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":4}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14225285635863713990,{"inputs":[{"Node":{"node_id":8410534738018320047,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"DVec2":[25.333333333333485,12.641975308641918]},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[1.0,1.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.5,0.5]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11899713172487274471,{"inputs":[{"Node":{"node_id":9954843247420111867,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[6580280438672662494,{"inputs":[{"Node":{"node_id":15395954548128560685,"output_index":0,"lambda":false}},{"Node":{"node_id":14598755603287563819,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[17967471489196302183,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[2,[568.8888888888889,785.4814814814813]],[1,[339.25925925925924,1025.185185185185]],[3,[334.8148148148148,1025.4814814814813]]]},"segments":{"add":[1,2,3],"remove":[],"start_point":[[3,3],[2,2],[1,1]],"end_point":[[3,1],[1,2],[2,3]],"handle_primary":[[1,[0.0,0.0]],[2,[0.0,0.0]],[3,[0.0,0.0]]],"handle_end":[[1,[-209.77777777777777,108.44444444444468]],[3,null],[2,[42.07407407407419,-157.6296296296293]]],"stroke":[[2,0],[1,0],[3,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":3}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10086073308516686449,{"inputs":[{"Value":{"tagged_value":{"GraphicGroup":{"instance":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":3971837674569123876,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4222034829755771252,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[4,[161.6241426611797,258.3703703703704]],[2,[155.25925925925927,256.7901234567901]],[3,[152.49382716049382,262.71604938271605]],[1,[165.5308641975309,250.07407407407408]]]},"segments":{"add":[1,2,3,4],"remove":[],"start_point":[[2,2],[1,1],[3,3],[4,4]],"end_point":[[3,4],[1,2],[4,1],[2,3]],"handle_primary":[[1,[0.0,0.0]],[2,[-1.9753086419753176,0.790123456790127]],[4,[2.7654320987654444,-3.950617283950635]],[3,[0.0,0.0]]],"handle_end":[[3,[-2.7654320987654444,3.950617283950635]],[4,[0.0,0.0]],[1,[1.9753086419753176,-0.790123456790127]],[2,[-0.3950617283950919,-1.7777777777777717]]],"stroke":[[2,0],[3,0],[4,0],[1,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":4}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4307303572241320716,{"inputs":[{"Node":{"node_id":4265165189651403984,"output_index":0,"lambda":false}},{"Node":{"node_id":4572557574846980832,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2878992817082507910,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[2,[738.074074074074,1027.2592592592591]],[3,[741.6296296296296,1027.5555555555557]],[1,[777.4814814814814,867.5555555555555]]]},"segments":{"add":[1,2,3],"remove":[],"start_point":[[1,1],[3,3],[2,2]],"end_point":[[1,2],[3,1],[2,3]],"handle_primary":[[3,[0.0,0.0]],[1,[0.0,0.0]],[2,[0.0,0.0]]],"handle_end":[[2,[0.0,0.0]],[1,[0.0,0.0]],[3,[-25.185185185185105,132.14814814814804]]],"stroke":[[2,0],[1,0],[3,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":3}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[9863310024364795214,{"inputs":[{"Node":{"node_id":5278509881589546420,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[11025165626998987360,{"inputs":[{"Node":{"node_id":5326536612985524219,"output_index":0,"lambda":false}},{"Node":{"node_id":4332145463108161926,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":40.0},"exposed":false}},{"Value":{"tagged_value":{"F64":-15.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[15982852655074258238,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2],"remove":[],"delta":[[1,[837.9999999999998,535.8024691358025]],[2,[798.222222222222,639.8024691358025]]]},"segments":{"add":[1,2],"remove":[],"start_point":[[2,2],[1,1]],"end_point":[[1,2],[2,1]],"handle_primary":[[1,[0.0,0.0]],[2,[31.037037037037067,-61.11111111111131]]],"handle_end":[[2,null],[1,[34.000000000000114,-59.77777777777783]]],"stroke":[[1,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":2}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[17699121037850769131,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[4,[158.22222222222223,332.0]],[3,[282.2222222222222,277.3333333333333]],[2,[429.33333333333326,295.1111111111111]],[1,[531.1111111111111,364.0]]]},"segments":{"add":[1,2,3],"remove":[],"start_point":[[1,1],[2,2],[3,3]],"end_point":[[3,4],[1,2],[2,3]],"handle_primary":[[2,[-56.8888888888888,-24.0]],[1,[0.0,0.0]],[3,[-33.333333333333286,6.666666666666686]]],"handle_end":[[3,[60.0,-41.77777777777777]],[2,[33.333333333333314,-6.666666666666686]],[1,[56.8888888888888,24.0]]],"stroke":[[3,0],[1,0],[2,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[5174744389209053970,{"inputs":[{"Node":{"node_id":12385950900718181935,"output_index":0,"lambda":false}},{"Node":{"node_id":5040278174920511484,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[9778375740427894463,{"inputs":[{"Node":{"node_id":16137033772363318157,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[5002654561220917457,{"inputs":[{"Node":{"node_id":11632506522064533635,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":35.0},"exposed":false}},{"Value":{"tagged_value":{"U32":206},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"u32","alias":null}},"import_index":2}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::PoissonDiskPointsNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[1689789805659535712,{"inputs":[{"Node":{"node_id":15637103575662751567,"output_index":0,"lambda":false}},{"Node":{"node_id":11590691579869262546,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[8699675339613677057,{"inputs":[{"Node":{"node_id":15982852655074258238,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"DVec2":[40.2222222222224,-10.469135802469168]},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[1.0,1.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.5,0.5]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[18207065424980079673,{"inputs":[{"Node":{"node_id":13035777574951374461,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2959546142916532439,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[1,[0.5,0.0]],[2,[1.0,0.5]],[3,[0.5,1.0]],[4,[0.0,0.5]]]},"segments":{"add":[1,2,3,4],"remove":[],"start_point":[[2,2],[1,1],[3,3],[4,4]],"end_point":[[4,1],[3,4],[1,2],[2,3]],"handle_primary":[[1,[0.27589238888950707,0.0]],[2,[0.0,0.27589238888950707]],[3,[-0.275892388889507,0.0]],[4,[0.0,-0.275892388889507]]],"handle_end":[[1,[0.0,-0.275892388889507]],[4,[-0.275892388889507,0.0]],[2,[0.27589238888950707,0.0]],[3,[0.0,0.27589238888950707]]],"stroke":[[1,0],[3,0],[2,0],[4,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":4}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11479098559726891734,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7,8,9,10,11,12],"remove":[],"delta":[[9,[717.5491540923639,95.80978509373573]],[8,[709.979576284103,102.93065081542449]],[6,[717.9588477366254,99.32144490169182]],[1,[660.660265203475,61.39551897576588]],[10,[712.047553726566,86.56241426611797]],[2,[669.2053040695015,63.20987654320987]],[5,[718.310013717421,90.01554641060812]],[3,[686.5294924554183,63.38545953360767]],[12,[683.3104709647919,64.0877914951989]],[11,[694.9574759945133,76.78829446730683]],[7,[710.5648529187624,103.39887212315196]],[4,[704.5560128029263,81.29492455418381]]]},"segments":{"add":[1,2,3,4,5,6,7,8,9,10,11,12],"remove":[],"start_point":[[4,4],[10,10],[2,2],[9,9],[3,3],[7,7],[6,6],[8,8],[1,1],[5,5],[12,12],[11,11]],"end_point":[[2,3],[7,8],[6,7],[4,5],[9,10],[8,9],[11,12],[1,2],[12,1],[5,6],[10,11],[3,4]],"handle_primary":[[6,[-1.9184335509834227,1.995170893022717]],[10,[-4.096936442615174,-1.872885230909901]],[8,[0.0,0.0]],[11,[-5.618655692729931,-7.257430269775952]],[3,[3.4531321444902687,2.1655235482396193]],[2,[5.4430727023319605,-0.6438042981252892]],[4,[8.369455875628773,2.867855509830818]],[1,[0.0,0.0]],[9,[0.17558299039785652,-3.5116598079561214]],[5,[1.1120256058526363,1.9314128943758817]],[12,[-12.8760859625055,-0.4682213077274682]],[7,[-0.585276634659408,-0.4682213077274753]]],"handle_end":[[7,null],[12,[4.9748513946045705,5.91129401005945]],[10,[5.464020763447934,7.057693486120044]],[6,[1.706505264591101,-0.4025776799149554]],[5,[2.926383173296813,-3.043438500228561]],[8,[-0.17558299039785652,3.511659807956093]],[1,[-5.4430727023319605,0.6438042981252892]],[2,[-3.4853769593560173,-2.1857448728164144]],[4,[-1.8416562954789697,-3.1986661974113133]],[9,[4.0931309699032,1.8711455862415676]],[3,[-8.369455875628773,-2.867855509830818]],[11,[4.036165212980222,0.14676964410837456]]],"stroke":[[10,0],[12,0],[9,0],[7,0],[8,0],[11,0],[1,0],[4,0],[2,0],[6,0],[5,0],[3,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":12}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[6282972142629473139,{"inputs":[{"Node":{"node_id":15815816861435910950,"output_index":0,"lambda":false}},{"Node":{"node_id":15578929303912288394,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2660652185019504730,{"inputs":[{"Node":{"node_id":1806828617441445250,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":8.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3406722917122601552,{"inputs":[{"Value":{"tagged_value":"None","exposed":false}},{"Value":{"tagged_value":{"F64":1.0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::generator_nodes::CircleNode"}},"visible":true,"skip_deduplication":false}],[1167210731467447244,{"inputs":[{"Node":{"node_id":16551385471328831128,"output_index":0,"lambda":false}},{"Node":{"node_id":10432831427187785843,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16530658574540156160,{"inputs":[{"Node":{"node_id":11666664915283969027,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"DVec2":[23.70370370370381,12.641975308641918]},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[1.0,1.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.5,0.5]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4248321400839848160,{"inputs":[{"Value":{"tagged_value":{"GraphicGroup":{"instance":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":13231685386999438557,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[907841922684377912,{"inputs":[{"Node":{"node_id":17336535036064625290,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[12219771677493189964,{"inputs":[{"Value":{"tagged_value":{"GraphicGroup":{"instance":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":5140869461760168364,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[9954843247420111867,{"inputs":[{"Node":{"node_id":6988349135757634271,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"DVec2":[0.14046639231827385,0.1473642955124319]},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[1.0,1.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.5,0.5]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10619788176782820865,{"inputs":[{"Node":{"node_id":2397243911096708995,"output_index":0,"lambda":false}},{"Node":{"node_id":1157261387411722141,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14285767317419627814,{"inputs":[{"Node":{"node_id":6749771744300551215,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[12049041947382267086,{"inputs":[{"Node":{"node_id":2959546142916532439,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"DVec2":[25.77777777777777,508.44444444444446]},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[8.0,8.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.5,0.5]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11573595155909211511,{"inputs":[{"Node":{"node_id":10127467043900015225,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[17891208858820401648,{"inputs":[{"Node":{"node_id":1204243038352113866,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"DVec2":[-7.407407407407391,4.740740740740762]},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[1.0,1.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.5,0.5]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15949658764632267703,{"inputs":[{"Node":{"node_id":14012583111791538162,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13352561089252322209,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[1,[612.0,1025.3333333333333]],[4,[615.5555555555555,1025.7777777777778]],[3,[752.4444444444443,739.1111111111111]],[2,[749.7777777777777,741.7777777777778]]]},"segments":{"add":[1,2,3,4],"remove":[],"start_point":[[4,4],[1,1],[3,3],[2,2]],"end_point":[[4,1],[1,2],[2,3],[3,4]],"handle_primary":[[2,[0.0,0.0]],[4,[0.0,0.0]],[1,[0.0,0.0]],[3,[0.0,0.0]]],"handle_end":[[3,[28.000000000000114,-107.55555555555544]],[4,[-0.4444444444444571,0.0]],[2,[0.0,0.0]],[1,[-112.0,179.55555555555577]]],"stroke":[[4,0],[1,0],[2,0],[3,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":4}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10689298484366290551,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[2,[151.22962962962964,252.1283950617284]],[3,[155.85185185185185,253.03703703703707]],[1,[156.93571992954355,246.07901729349]]]},"segments":{"add":[1,2,3],"remove":[],"start_point":[[2,2],[1,1],[3,3]],"end_point":[[3,1],[2,3],[1,2]],"handle_primary":[[2,[-0.4744436253241133,1.2651830008642833]],[3,[1.0949818244169762,-0.3546380887060252]],[1,[-2.071522398679349,1.8617234472507391]]],"handle_end":[[3,[1.9215307714004553,1.0902372408288272]],[1,[0.9481481481481068,-2.5283950617284177]],[2,[-1.0949818244169762,0.3546380887060252]]],"stroke":[[1,0],[2,0],[3,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":3}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[1785173043494067496,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[2,[636.4444444444443,579.5555555555555]],[4,[770.2222222222222,459.1111111111111]],[1,[566.6666666666666,576.0]],[3,[712.0,519.1111111111111]]]},"segments":{"add":[1,2,3],"remove":[],"start_point":[[3,3],[2,2],[1,1]],"end_point":[[1,2],[2,3],[3,4]],"handle_primary":[[1,[0.0,0.0]],[3,[18.22222222222217,-21.777777777777715]],[2,[31.1111111111112,-17.33333333333337]]],"handle_end":[[3,[0.0,0.0]],[2,[-18.22222222222217,21.777777777777715]],[1,[-31.1111111111112,17.33333333333337]]],"stroke":[[2,0],[3,0],[1,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[12554368619682347699,{"inputs":[{"Node":{"node_id":2594533001540454577,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":3.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[13261814586176172586,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],"remove":[],"delta":[[13,[736.8888888888889,432.2962962962963]],[6,[775.5061728395061,429.23456790123464]],[8,[686.5302034429451,490.6109861193811]],[9,[758.716049382716,441.8765432098765]],[12,[715.8518518518517,452.14814814814815]],[15,[817.4814814814815,272.2962962962963]],[4,[858.6666666666666,268.88888888888886]],[10,[755.3580246913581,432.5925925925926]],[1,[799.1111111111112,188.14814814814815]],[14,[782.8148148148148,378.96296296296293]],[16,[809.1851851851852,207.1111111111111]],[3,[851.1111111111111,237.7777777777778]],[7,[680.4331323644109,506.0568995183343]],[11,[719.9999999999999,460.8395061728396]],[5,[829.8271604938273,345.08641975308643]],[2,[827.2592592592594,206.41975308641975]]]},"segments":{"add":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],"remove":[],"start_point":[[15,15],[5,5],[11,11],[4,4],[12,12],[3,3],[14,14],[2,2],[6,6],[16,16],[8,8],[13,13],[1,1],[7,7],[10,10],[9,9]],"end_point":[[16,1],[11,12],[10,11],[1,2],[12,13],[6,7],[2,3],[4,5],[3,4],[13,14],[14,15],[5,6],[8,9],[15,16],[7,8],[9,10]],"handle_primary":[[10,[0.0,0.0]],[5,[-31.06481223802939,48.93526760703577]],[9,[0.0,0.0]],[1,[0.0,0.0]],[6,[-36.541158121167314,42.67873357730855]],[7,null],[8,[37.39536928167615,-11.787670751832536]],[11,[0.0,0.0]],[16,[0.0,0.0]],[13,[0.0,0.0]],[12,[0.0,0.0]],[4,[-2.5679012345678984,17.77777777777777]],[2,[0.0,0.0]],[14,[20.148148148148152,-33.481481481481524]],[3,[9.086419753086489,9.086419753086432]],[15,[5.925925925925867,-34.96296296296299]]],"handle_end":[[4,[31.06481223802939,-48.93526760703571]],[14,[-5.925925925925867,34.96296296296299]],[1,[0.0,0.0]],[15,[6.51851851851859,11.851851851851848]],[3,[2.5679012345678984,-17.77777777777777]],[2,[-9.086419753086489,-9.086419753086432]],[6,[22.320987654321016,-14.222222222222342]],[11,[0.0,0.0]],[10,[0.0,0.0]],[5,[18.3855550289378,-21.473654506216747]],[16,[0.0,0.0]],[7,null],[13,[-20.148148148148152,33.481481481481524]],[12,[0.0,0.0]],[8,[-11.555555555555657,17.18518518518522]],[9,[0.0,0.0]]],"stroke":[[15,0],[14,0],[9,0],[5,0],[4,0],[3,0],[10,0],[6,0],[1,0],[13,0],[16,0],[7,0],[8,0],[12,0],[2,0],[11,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":16}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11616089678400336955,{"inputs":[{"Node":{"node_id":2660652185019504730,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.8},"exposed":false}},{"Value":{"tagged_value":{"F64":3.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[17336535036064625290,{"inputs":[{"Node":{"node_id":10421722418968896452,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"DVec2":[49.47996245659249,5.913900401382151]},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.9277405532359332,0.9277405532359332]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.5,0.5]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[1621196991038859321,{"inputs":[{"Node":{"node_id":15857077552290328068,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3150436463719911922,{"inputs":[{"Node":{"node_id":18214377096178867498,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[1.0,1.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.5,0.5]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[5455777299776842371,{"inputs":[{"Node":{"node_id":9470742171134780193,"output_index":0,"lambda":false}},{"Node":{"node_id":7385465194555106679,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13045580349734858212,{"inputs":[{"Node":{"node_id":10795820039540504703,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"u32","alias":null}},"import_index":2}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::PoissonDiskPointsNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10432831427187785843,{"inputs":[{"Node":{"node_id":2087303479944421366,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14209241002058525241,{"inputs":[{"Node":{"node_id":16290933138334939444,"output_index":0,"lambda":false}},{"Node":{"node_id":10918055532782314571,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[9374264173303233490,{"inputs":[{"Node":{"node_id":1713644030979611623,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[8934999452649011837,{"inputs":[{"Node":{"node_id":16796171662855500935,"output_index":0,"lambda":false}},{"Node":{"node_id":16756940771483104467,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4787732047489141819,{"inputs":[{"Node":{"node_id":12062649793560663566,"output_index":0,"lambda":false}},{"Node":{"node_id":4248321400839848160,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16614450796751955858,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7],"remove":[],"delta":[[5,[807.3333333333334,1026.0]],[6,[845.3333333333333,842.0000000000001]],[2,[757.1358024691358,661.5308641975308]],[3,[481.33333333333337,826.6666666666666]],[4,[327.3333333333333,1024.6666666666663]],[1,[902.6666666666666,446.6666666666667]],[7,[918.6666666666664,604.6666666666666]]]},"segments":{"add":[1,2,3,4,5,6,7],"remove":[],"start_point":[[1,1],[3,3],[5,5],[6,6],[7,7],[2,2],[4,4]],"end_point":[[6,7],[7,1],[1,2],[4,5],[2,3],[3,4],[5,6]],"handle_primary":[[4,[0.0,0.0]],[1,[0.0,0.0]],[2,[-138.41983388553547,108.26897897977506]],[5,[0.0,0.0]],[3,[-131.33333333333337,78.66666666666652]],[6,[49.4943341398548,-116.98660796692934]],[7,[16.000000000000227,-89.99999999999989]]],"handle_end":[[7,[3.3333333333333712,32.00000000000006]],[5,[-36.66666666666663,86.66666666666652]],[2,[143.2366194125077,-85.79655375977609]],[1,[134.66666666666686,-105.33333333333326]],[4,[0.0,0.0]],[6,[-16.71260304301461,94.00839211695676]],[3,[0.0,0.0]]],"stroke":[[2,0],[4,0],[1,0],[5,0],[6,0],[7,0],[3,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":7}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[6666260895482068061,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[1,[643.0921942512911,135.30336230847865]],[2,[645.6821893629258,155.3850506865855]],[3,[646.4033730994855,154.80329633678198]],[4,[645.3845450388659,135.9012345679012]]]},"segments":{"add":[1,2,3,4],"remove":[],"start_point":[[2,2],[3,3],[4,4],[1,1]],"end_point":[[2,3],[4,1],[1,2],[3,4]],"handle_primary":[[4,[0.0,0.0]],[2,[0.0,0.0]],[1,[0.0,0.0]],[3,[-0.2558402858584259,-10.083527774255913]]],"handle_end":[[4,[1.68322954928135,-0.022087435068414152]],[1,[-0.05703059647760256,-13.444628325495556]],[2,[-0.3446760851414865,0.611494768909921]],[3,[0.0,0.0]]],"stroke":[[3,0],[4,0],[1,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":4}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7893851488963635918,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2],"remove":[],"delta":[[1,[125.0,420.0]],[2,[24.0,486.0]]]},"segments":{"add":[1],"remove":[],"start_point":[[1,1]],"end_point":[[1,2]],"handle_primary":[[1,[0.0,0.0]]],"handle_end":[[1,[23.0,-70.0]]],"stroke":[[1,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3802858053991775169,{"inputs":[{"Node":{"node_id":11058365317860779469,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":25.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"u32","alias":null}},"import_index":2}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::PoissonDiskPointsNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11199691961479466803,{"inputs":[{"Node":{"node_id":7141088190930752823,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[7141088190930752823,{"inputs":[{"Node":{"node_id":541002100261582638,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[18319784717194273926,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7,8,9,10,11,12],"remove":[],"delta":[[7,[558.6666666666666,749.7777777777778]],[5,[418.2222222222222,754.6666666666666]],[2,[150.22222222222223,568.4444444444445]],[10,[610.6666666666666,712.4444444444443]],[12,[437.99999999999994,690.0]],[6,[443.1111111111111,783.1111111111111]],[8,[706.6666666666666,687.5555555555554]],[11,[595.0,690.0]],[1,[172.22222222222217,564.7777777777779]],[3,[167.0,691.0]],[9,[828.0,570.2222222222221]],[4,[574.6666666666666,712.4444444444443]]]},"segments":{"add":[1,2,3,4,5,6,7,8,9,10,11,12],"remove":[],"start_point":[[5,5],[9,9],[12,12],[11,11],[3,3],[8,8],[1,1],[7,7],[10,10],[2,2],[4,4],[6,6]],"end_point":[[8,9],[4,5],[10,11],[12,1],[2,3],[11,12],[1,2],[6,7],[9,10],[3,4],[5,6],[7,8]],"handle_primary":[[2,[18.111111111111057,85.22222222222229]],[12,[-98.22222222222224,-28.0]],[1,[0.0,0.0]],[11,[0.0,0.0]],[9,[0.0,0.0]],[7,[32.888888888888914,-13.333333333333483]],[4,[0.0,0.0]],[8,[60.44444444444446,-39.55555555555566]],[5,[0.0,0.0]],[6,[0.0,0.0]],[10,[0.0,0.0]],[3,[0.0,0.0]]],"handle_end":[[5,[-18.66666666666663,-4.888888888888914]],[12,[161.33333333333337,34.66666666666674]],[3,[-128.44444444444446,26.22222222222217]],[9,[145.77777777777771,-61.777777777777715]],[4,[54.22222222222223,-9.333333333333371]],[7,[-60.44444444444446,39.55555555555566]],[10,[-1.3333333333333712,21.77777777777783]],[6,[-32.888888888888914,13.333333333333483]],[1,null],[8,[0.0,0.0]],[11,[98.22222222222224,28.0]],[2,null]],"stroke":[[5,0],[6,0],[12,0],[11,0],[1,0],[7,0],[3,0],[9,0],[4,0],[10,0],[2,0],[8,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":12}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4479074488343511985,{"inputs":[{"Node":{"node_id":11479098559726891734,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.8980392,"green":0.8,"blue":0.6156863,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8980392,"green":0.8,"blue":0.6156863,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[16137033772363318157,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[2,[720.417009602195,178.00603566529497]],[1,[688.566255144033,175.3371742112483]],[3,[720.1360768175583,181.58792866941016]]]},"segments":{"add":[1,2,3],"remove":[],"start_point":[[1,1],[3,3],[2,2]],"end_point":[[1,2],[3,1],[2,3]],"handle_primary":[[3,[-1.1237311385458495,-3.125377229080982]],[2,[1.8041152263373303,2.00164609053499]],[1,[29.423007364946784,-0.024697364703285984]]],"handle_end":[[1,null],[2,null],[3,[12.04499314128941,0.8076817558298615]]],"stroke":[[1,0],[2,0],[3,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":3}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3170924135668664007,{"inputs":[{"Node":{"node_id":4787732047489141819,"output_index":0,"lambda":false}},{"Node":{"node_id":13444661581815146533,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16051539163551573193,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5],"remove":[],"delta":[[5,[588.0,930.6666666666666]],[1,[708.0000000000001,769.3333333333333]],[3,[514.6666666666666,1025.7777777777778]],[4,[519.1111111111111,1026.2222222222222]],[2,[609.7777777777777,896.0]]]},"segments":{"add":[1,2,3,4,5],"remove":[],"start_point":[[5,5],[1,1],[2,2],[4,4],[3,3]],"end_point":[[1,2],[3,4],[2,3],[5,1],[4,5]],"handle_primary":[[5,[24.0,-29.77777777777783]],[3,[0.0,0.0]],[1,[0.0,0.0]],[4,[0.0,0.0]],[2,[-54.66666666666663,69.33333333333314]]],"handle_end":[[1,[54.66666666666663,-69.33333333333326]],[2,[0.0,0.0]],[4,[-24.0,29.777777777777715]],[5,[-28.44444444444457,47.111111111111086]],[3,[0.0,0.0]]],"stroke":[[2,0],[4,0],[5,0],[3,0],[1,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":5}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[6292009934909381201,{"inputs":[{"Node":{"node_id":10424806499648491677,"output_index":0,"lambda":false}},{"Node":{"node_id":9778375740427894463,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[1204243038352113866,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2],"remove":[],"delta":[[2,[837.3333333333334,653.6296296296296]],[1,[808.8888888888889,832.2962962962965]]]},"segments":{"add":[1,2],"remove":[],"start_point":[[1,1],[2,2]],"end_point":[[2,1],[1,2]],"handle_primary":[[1,[0.0,0.0]],[2,[-26.22222222222217,80.29629629629608]]],"handle_end":[[2,[0.0,-0.4444444444443434]],[1,[-22.22222222222217,79.40740740740739]]],"stroke":[[1,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":2}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[12062649793560663566,{"inputs":[{"Node":{"node_id":5455777299776842371,"output_index":0,"lambda":false}},{"Node":{"node_id":8934999452649011837,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4572557574846980832,{"inputs":[{"Node":{"node_id":13014916927589286309,"output_index":0,"lambda":false}},{"Node":{"node_id":4332145463108161926,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":0.5},"exposed":false}},{"Value":{"tagged_value":{"F64":30.0},"exposed":false}},{"Value":{"tagged_value":{"F64":-60.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[3992858139802231032,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[3,[648.9547325102881,151.8792866941015]],[4,[645.384545038866,135.90123456790124]],[2,[635.8445358939186,153.225422953818]],[1,[634.615454961134,135.08184727937814]]]},"segments":{"add":[1,2,3,4],"remove":[],"start_point":[[3,3],[1,1],[4,4],[2,2]],"end_point":[[1,2],[2,3],[3,4],[4,1]],"handle_primary":[[2,[6.203932327389111,7.491540923639718]],[4,[0.0,0.0]],[3,[1.8143575674440624,-2.575217192501128]],[1,[0.0,0.0]]],"handle_end":[[3,[6.730681298582454,7.257430269775966]],[1,[-6.203932327389111,-7.491540923639718]],[2,[-1.8143575674440624,2.575217192501128]],[4,[9.247370827617717,-0.3511659807956278]]],"stroke":[[4,0],[2,0],[3,0],[1,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":4}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[17494926338451345058,{"inputs":[{"Node":{"node_id":1167210731467447244,"output_index":0,"lambda":false}},{"Node":{"node_id":9529195152569434392,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14098374807212007572,{"inputs":[{"Node":{"node_id":17494926338451345058,"output_index":0,"lambda":false}},{"Node":{"node_id":10336592647221792772,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[8091904580702893317,{"inputs":[{"Node":{"node_id":15446793500614592278,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[15492651270767932214,{"inputs":[{"Node":{"node_id":6580280438672662494,"output_index":0,"lambda":false}},{"Node":{"node_id":2698266912167150713,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10918055532782314571,{"inputs":[{"Node":{"node_id":7447657690776686262,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[18067513817508158001,{"inputs":[{"Node":{"node_id":16649851742084147477,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[1661691009086487874,{"inputs":[{"Node":{"node_id":14797986717815207528,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14029368390543839187,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[3,[808.0,413.33333333333337]],[1,[604.8888888888889,523.5555555555557]],[2,[668.4444444444445,516.4444444444443]]]},"segments":{"add":[1,2],"remove":[],"start_point":[[2,2],[1,1]],"end_point":[[1,2],[2,3]],"handle_primary":[[1,[0.0,0.0]],[2,[23.1111111111112,-9.7777777777776]]],"handle_end":[[1,[-23.1111111111112,9.7777777777776]],[2,[-59.111111111111086,58.22222222222223]]],"stroke":[[2,0],[1,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15896921950407486754,{"inputs":[{"Node":{"node_id":13163272246010991228,"output_index":0,"lambda":false}},{"Node":{"node_id":11199691961479466803,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15466714490303763249,{"inputs":[{"Node":{"node_id":10514847656270897393,"output_index":0,"lambda":false}},{"Node":{"node_id":11659756061767599421,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2659768650911099730,{"inputs":[{"Node":{"node_id":13045087323693407920,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":6.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[12224498203743157414,{"inputs":[{"Node":{"node_id":2878992817082507910,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[13045087323693407920,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2],"remove":[],"delta":[[2,[227.0,496.0]],[1,[19.0,494.0]]]},"segments":{"add":[1],"remove":[],"start_point":[[1,1]],"end_point":[[1,2]],"handle_primary":[[1,[0.0,0.0]]],"handle_end":[[1,[-98.0,-55.0]]],"stroke":[[1,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[8240895922641772563,{"inputs":[{"Node":{"node_id":16530658574540156160,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[13644138583806412631,{"inputs":[{"Node":{"node_id":2641530639940889619,"output_index":0,"lambda":false}},{"Node":{"node_id":12473080738469616517,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11021243031011826737,{"inputs":[{"Node":{"node_id":16446146761452576438,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[17064046832210629373,{"inputs":[{"Node":{"node_id":12219771677493189964,"output_index":0,"lambda":false}},{"Node":{"node_id":11677503666435782605,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10420981328998103391,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[3,[694.2222222222222,623.5555555555554]],[2,[844.4444444444443,460.44444444444434]],[1,[859.5555555555554,375.1111111111111]]]},"segments":{"add":[1,2],"remove":[],"start_point":[[1,1],[2,2]],"end_point":[[2,3],[1,2]],"handle_primary":[[1,[0.0,0.0]],[2,[-11.999999999999886,30.6666666666668]]],"handle_end":[[1,[11.055745483535702,-28.253571791258253]],[2,[76.88888888888891,-30.666666666666742]]],"stroke":[[1,0],[2,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15460109068588328521,{"inputs":[{"Node":{"node_id":5185036609290210853,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.9019608,"green":0.8,"blue":0.6,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.9019608,"green":0.8,"blue":0.6,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[17815494794630739611,{"inputs":[{"Node":{"node_id":14079496619264986678,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[4131094614457622424,{"inputs":[{"Node":{"node_id":11356586238302409958,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10860592954464951000,{"inputs":[{"Node":{"node_id":4236845268521674740,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[12387541320114693418,{"inputs":[{"Node":{"node_id":5471152581000334146,"output_index":0,"lambda":false}},{"Node":{"node_id":15460109068588328521,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[9182448229950585507,{"inputs":[{"Node":{"node_id":12496143061817048445,"output_index":0,"lambda":false}},{"Node":{"node_id":7320676248579211727,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[431994205232245356,{"inputs":[{"Node":{"node_id":12387541320114693418,"output_index":0,"lambda":false}},{"Node":{"node_id":14894569344576297448,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[12594527670567285670,{"inputs":[{"Node":{"node_id":4663768795652429571,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14345191642063772510,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[3,[813.3557395833334,961.1454375]],[2,[833.7777777777777,780.4444444444443]],[4,[838.2222222222222,766.6666666666669]],[1,[880.8888888888888,556.4444444444443]]]},"segments":{"add":[1,2,3,4],"remove":[],"start_point":[[3,3],[4,4],[2,2],[1,1]],"end_point":[[2,3],[4,1],[1,2],[3,4]],"handle_primary":[[2,[-9.333333333333371,54.66666666666674]],[1,[0.0,0.0]],[3,[0.0,0.0]],[4,[10.643023589139377,-58.51588472312813]]],"handle_end":[[4,[-0.4444444444444571,-0.8888888888888005]],[2,[0.0,0.0]],[1,[9.333333333333371,-54.66666666666674]],[3,[-10.643023589139377,58.51588472312813]]],"stroke":[[2,0],[4,0],[1,0],[3,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":4}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[12531351117929704587,{"inputs":[{"Node":{"node_id":11194653561109699287,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[12801133692316734622,{"inputs":[{"Node":{"node_id":17699121037850769131,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[12385950900718181935,{"inputs":[{"Node":{"node_id":4372998635946271235,"output_index":0,"lambda":false}},{"Node":{"node_id":615144098061106242,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[1713644030979611623,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2],"remove":[],"delta":[[2,[321.33333333333326,1022.0]],[1,[404.0,882.6666666666666]]]},"segments":{"add":[1],"remove":[],"start_point":[[1,1]],"end_point":[[1,2]],"handle_primary":[[1,[0.0,0.0]]],"handle_end":[[1,[30.96296296296316,-100.2222222222224]]],"stroke":[[1,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3649809135741361946,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2],"remove":[],"delta":[[1,[787.1111111111111,414.66666666666663]],[2,[841.3333333333333,336.8888888888889]]]},"segments":{"add":[1],"remove":[],"start_point":[[1,1]],"end_point":[[1,2]],"handle_primary":[[1,[0.0,0.0]]],"handle_end":[[1,[-21.333333333333258,48.888888888888914]]],"stroke":[[1,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[5213978458941436169,{"inputs":[{"Node":{"node_id":13261814586176172586,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":7.0},"exposed":false}},{"Value":{"tagged_value":{"U32":10},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"u32","alias":null}},"import_index":2}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::PoissonDiskPointsNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4663768795652429571,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6],"remove":[],"delta":[[6,[706.633744855967,98.10699588477364]],[1,[691.7530864197531,86.91358024691357]],[5,[710.8379820149368,102.96966925773508]],[4,[713.0620332266423,107.3007163542143]],[3,[708.8285322359397,101.48696844993144]],[2,[696.6255144032922,96.92181069958846]]]},"segments":{"add":[1,2,3,4,5,6],"remove":[],"start_point":[[1,1],[6,6],[2,2],[5,5],[3,3],[4,4]],"end_point":[[2,3],[3,4],[1,2],[6,1],[4,5],[5,6]],"handle_primary":[[2,[6.057613168724288,1.9753086419753032]],[6,[-6.847736625514244,-2.3703703703703525]],[1,[0.0,0.0]],[4,[0.0,0.0]],[3,[1.7753391251332005,4.7992684042066]],[5,[-0.8974241731443726,-2.770309404054231]]],"handle_end":[[5,[2.9051419934493197,1.005626074655538]],[4,[0.786301337230384,2.4272780410153985]],[6,[1.1851851851849915,8.823045267489718]],[2,[-0.7886938944185431,-2.1320736046921525]],[1,[-6.057613168724288,-1.9753086419753032]],[3,[-0.9218106995884908,-0.3950617283950635]]],"stroke":[[3,0],[1,0],[5,0],[2,0],[6,0],[4,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":6}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10599660455959346550,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[1,[478.2222222222222,515.1111111111111]],[4,[745.3333333333333,471.55555555555554]],[2,[572.0,570.2222222222222]],[3,[654.6666666666666,546.6666666666666]]]},"segments":{"add":[1,2,3],"remove":[],"start_point":[[1,1],[2,2],[3,3]],"end_point":[[1,2],[3,4],[2,3]],"handle_primary":[[3,[26.222222222222285,-16.0]],[2,[31.555555555555543,7.555555555555543]],[1,[0.0,0.0]]],"handle_end":[[1,[-31.555555555555543,-7.555555555555543]],[2,[-26.222222222222285,16.0]],[3,[0.0,0.0]]],"stroke":[[3,0],[2,0],[1,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16756940771483104467,{"inputs":[{"Node":{"node_id":13975451746581400000,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.84705883,"green":0.5372549,"blue":0.38431373,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.84705883,"green":0.5372549,"blue":0.38431373,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[17207895962122263432,{"inputs":[{"Node":{"node_id":11573595155909211511,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[2175432926627256613,{"inputs":[{"Value":{"tagged_value":{"GraphicGroup":{"instance":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":14982414026754548178,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[17945736750161448391,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[2,[688.3433248095167,92.67923984990472]],[1,[689.4327280262556,73.68042956754955]],[3,[687.4660700953133,94.52064202140812]],[4,[687.6968543916372,70.6398816184091]]]},"segments":{"add":[1,2,3,4],"remove":[],"start_point":[[4,4],[3,3],[1,1],[2,2]],"end_point":[[1,2],[4,1],[3,4],[2,3]],"handle_primary":[[3,[-0.975596082205584,-10.16276974584038]],[2,[0.0,0.0]],[4,[0.0,0.0]],[1,[-1.460603632035259,12.298077567102167]]],"handle_end":[[1,null],[4,[-0.3670368206467174,-1.6914035044494111]],[2,[0.6631784948407358,-0.4471776104951459]],[3,[0.0,0.0]]],"stroke":[[4,0],[1,0],[3,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":4}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16324258033206362312,{"inputs":[{"Node":{"node_id":16732130236852371275,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.0},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[14079496619264986678,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[2,[608.9876543209878,75.25925925925925]],[1,[597.2345679012346,77.92592592592592]],[3,[609.2839506172841,76.74074074074073]]]},"segments":{"add":[1,2,3],"remove":[],"start_point":[[2,2],[3,3],[1,1]],"end_point":[[3,1],[1,2],[2,3]],"handle_primary":[[2,[0.0,0.0]],[3,[0.0,0.0]],[1,[0.0,0.0]]],"handle_end":[[3,[8.09876543209873,0.2962962962962763]],[2,[0.0,0.0]],[1,[-6.222222222222172,-0.9876543209876588]]],"stroke":[[3,0],[1,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":3}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10253927692147706615,{"inputs":[{"Node":{"node_id":7262199696924786895,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[9529195152569434392,{"inputs":[{"Node":{"node_id":3121275823460307102,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[12876462860151722087,{"inputs":[{"Node":{"node_id":10619788176782820865,"output_index":0,"lambda":false}},{"Node":{"node_id":10415872992231003638,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15303587427289959766,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2],"remove":[],"delta":[[1,[610.6666666666666,706.6666666666666]],[2,[818.2222222222222,566.2222222222222]]]},"segments":{"add":[1],"remove":[],"start_point":[[1,1]],"end_point":[[1,2]],"handle_primary":[[1,[0.0,0.0]]],"handle_end":[[1,[-82.66666666666674,97.77777777777771]]],"stroke":[[1,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[12761901161949743155,{"inputs":[{"Node":{"node_id":7659717355245331967,"output_index":0,"lambda":false}},{"Node":{"node_id":8091904580702893317,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11268046366284173800,{"inputs":[{"Node":{"node_id":4453139144069993994,"output_index":0,"lambda":false}},{"Node":{"node_id":11616089678400336955,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[6416452251137958677,{"inputs":[{"Node":{"node_id":9374264173303233490,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[11194653561109699287,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6],"remove":[],"delta":[[4,[605.761316872428,82.28989483310471]],[6,[603.4567901234567,92.83950617283948]],[1,[604.3716161316235,95.4260819221956]],[5,[602.0316509633005,90.5516059992284]],[2,[607.4000914494741,86.85505258344766]],[3,[623.4951989026065,81.23639689071788]]]},"segments":{"add":[1,2,3,4,5,6],"remove":[],"start_point":[[6,6],[2,2],[3,3],[4,4],[1,1],[5,5]],"end_point":[[1,2],[4,5],[6,1],[2,3],[3,4],[5,6]],"handle_primary":[[5,[0.0,0.0]],[2,[3.687242798354191,-3.4531321444901835]],[3,[-0.7803688462123546,-2.7117817405883216]],[4,[-3.2460274482192517,2.85650415443304]],[6,[0.3965701826469967,0.8240731861035471]],[1,[0.0,0.0]]],"handle_end":[[6,[-2.273736754432321e-13,-4.263256414560601e-14]],[4,[-0.10095077423932251,-1.27829797882373]],[3,[4.389574759945049,-3.862825788751721]],[2,[-1.0144795000761633,1.6192653558908745]],[1,[-3.3249738510837687,3.113864400221118]],[5,[-0.3896135191956773,-0.8096172333722365]]],"stroke":[[3,0],[5,0],[6,0],[1,0],[4,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":6}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14887821801874852671,{"inputs":[{"Node":{"node_id":8230694129617719636,"output_index":0,"lambda":false}},{"Node":{"node_id":18279507457571359732,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7747398671834040298,{"inputs":[{"Node":{"node_id":18319784717194273926,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":30.0},"exposed":false}},{"Value":{"tagged_value":{"U32":47},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"u32","alias":null}},"import_index":2}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::PoissonDiskPointsNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[1869448627329502330,{"inputs":[{"Node":{"node_id":3827449344952693766,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[16796171662855500935,{"inputs":[{"Node":{"node_id":14993053984267866751,"output_index":0,"lambda":false}},{"Node":{"node_id":9371909264427723282,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14012648643507848353,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[3,[615.7168724279835,33.05349794238683]],[2,[613.7152263374486,29.076543209876547]],[4,[613.6098765432099,30.393415637860084]],[1,[610.080658436214,28.760493827160495]]]},"segments":{"add":[1,2,3,4],"remove":[],"start_point":[[2,2],[1,1],[4,4],[3,3]],"end_point":[[4,1],[2,3],[3,4],[1,2]],"handle_primary":[[3,[0.0,0.0]],[1,[0.0,0.0]],[2,[1.5990193552247547,1.4582133097558128]],[4,[-1.3168724279836397,-1.343209876543213]]],"handle_end":[[2,[-0.05267489711934559,-0.9218106995884768]],[3,[0.7962610294339356,0.812186250022549]],[4,[0.05267489711934559,0.02633744855966924]],[1,[-1.447323438899616,-1.3198753943965968]]],"stroke":[[4,0],[1,0],[3,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":4}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14894569344576297448,{"inputs":[{"Node":{"node_id":5555007473125503522,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[7525593029671097583,{"inputs":[{"Node":{"node_id":16175421708184657649,"output_index":0,"lambda":false}},{"Node":{"node_id":15735375935164094402,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15578929303912288394,{"inputs":[{"Node":{"node_id":10770443343193024138,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[10133176481349663495,{"inputs":[{"Node":{"node_id":12876462860151722087,"output_index":0,"lambda":false}},{"Node":{"node_id":11021243031011826737,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4332145463108161926,{"inputs":[{"Node":{"node_id":3406722917122601552,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[9740500978584792725,{"inputs":[{"Node":{"node_id":14946189826912398678,"output_index":0,"lambda":false}},{"Node":{"node_id":10586744777717861556,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10421722418968896452,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[3,[691.7384545038866,78.07590306355738]],[2,[683.3689986282578,99.49702789208962]],[1,[677.8673982624599,66.19478737997257]]]},"segments":{"add":[1,2,3],"remove":[],"start_point":[[3,3],[2,2],[1,1]],"end_point":[[1,2],[2,3],[3,1]],"handle_primary":[[3,[0.12630166293718048,-1.7247569518707309]],[1,[-0.49434169374126213,0.7369041683249975]],[2,[0.34676700844204333,0.512429191350904]]],"handle_end":[[3,[5.6142033131263815,-8.368968014727507]],[1,[-7.636184307015128,-11.284244620129414]],[2,[-1.4537474229852023,19.852161212683583]]],"stroke":[[2,0],[3,0],[1,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":3}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16551385471328831128,{"inputs":[{"Node":{"node_id":14991324592500870173,"output_index":0,"lambda":false}},{"Node":{"node_id":17207349373429328029,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[6532401937876437300,{"inputs":[{"Node":{"node_id":3992858139802231032,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[1.0,1.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.5,0.5]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[6988349135757634271,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[2,[188.0493827160494,269.116049382716]],[3,[183.0891632373113,268.771154223006]],[4,[184.5962505715592,263.55006858710567]],[1,[189.14614932392712,263.9984322947286]]]},"segments":{"add":[1,2,3,4],"remove":[],"start_point":[[2,2],[1,1],[3,3],[4,4]],"end_point":[[4,1],[1,2],[2,3],[3,4]],"handle_primary":[[3,[-0.9800640224909783,-1.3570273385153655]],[2,[-1.9972565157751203,0.9588085439937686]],[4,[1.697261300324044,-1.9917992948792855]],[1,[1.552958476004363,1.9059035841873424]]],"handle_end":[[1,[3.459421910557637,-1.6607397492127802]],[3,[-1.5959762231368018,1.872937487752267]],[2,[1.0091841400482906,1.3973479652491392]],[4,[-1.464617942413156,-1.7974856565980986]]],"stroke":[[4,0],[3,0],[1,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":4}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[1384427686127078856,{"inputs":[{"Node":{"node_id":17064046832210629373,"output_index":0,"lambda":false}},{"Node":{"node_id":17529660518597229229,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14057307926677215422,{"inputs":[{"Node":{"node_id":5861306074868809692,"output_index":0,"lambda":false}},{"Node":{"node_id":7450965328305122110,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3971837674569123876,{"inputs":[{"Node":{"node_id":4131094614457622424,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":3.3528},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[4832236468224231783,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2],"remove":[],"delta":[[1,[232.44444444444443,332.8888888888889]],[2,[369.77777777777777,381.7777777777778]]]},"segments":{"add":[1],"remove":[],"start_point":[[1,1]],"end_point":[[1,2]],"handle_primary":[[1,[0.0,0.0]]],"handle_end":[[1,[-73.77777777777777,-53.77777777777777]]],"stroke":[[1,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14991324592500870173,{"inputs":[{"Node":{"node_id":542361600097372754,"output_index":0,"lambda":false}},{"Node":{"node_id":10860592954464951000,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11630078441485655672,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2],"remove":[],"delta":[[1,[760.6913580246915,657.5802469135803]],[2,[751.4074074074075,685.0370370370371]]]},"segments":{"add":[1,2],"remove":[],"start_point":[[2,2],[1,1]],"end_point":[[1,2],[2,1]],"handle_primary":[[2,[4.543209876543187,-10.271604938271594]],[1,[0.0,0.0]]],"handle_end":[[2,null],[1,[7.111111111110972,-8.44444444444457]]],"stroke":[[1,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":2}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3970516859959908758,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[2,[78.22222222222219,579.2592592592591]],[1,[49.77777777777773,636.148148148148]],[3,[170.96296296296293,544.5925925925925]]]},"segments":{"add":[1,2],"remove":[],"start_point":[[2,2],[1,1]],"end_point":[[2,3],[1,2]],"handle_primary":[[2,[27.259259259259252,-24.88888888888891]],[1,[0.0,0.0]]],"handle_end":[[2,[-21.62962962962962,-2.0740740740740193]],[1,[-27.259259259259267,24.88888888888891]]],"stroke":[[2,0],[1,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13302269488061286120,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2],"remove":[],"delta":[[1,[262.66666666666674,903.3333333333331]],[2,[565.3333333333335,756.6666666666666]]]},"segments":{"add":[1],"remove":[],"start_point":[[1,1]],"end_point":[[1,2]],"handle_primary":[[1,[0.0,0.0]]],"handle_end":[[1,[-200.66666666666652,64.66666666666663]]],"stroke":[[1,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[1889157037801767612,{"inputs":[{"Node":{"node_id":17324767436949538365,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":30.0},"exposed":false}},{"Value":{"tagged_value":{"U32":18},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"u32","alias":null}},"import_index":2}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::PoissonDiskPointsNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10270446074640675342,{"inputs":[{"Node":{"node_id":14883504161508594099,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[1.0,1.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.5,0.5]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4078100635676202528,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26],"remove":[],"delta":[[5,[653.9851851851852,38.99259259259259]],[17,[639.762962962963,37.45185185185185]],[21,[605.3925925925926,49.42222222222222]],[18,[621.2740740740741,37.21481481481481]],[22,[607.6312757201646,47.64444444444445]],[13,[707.0814814814814,53.33333333333333]],[11,[665.4814814814815,56.05925925925925]],[26,[607.3152263374486,46.38024691358025]],[10,[653.1555555555556,49.89629629629629]],[14,[698.3111111111111,43.61481481481481]],[25,[604.6288065843622,39.321810699588475]],[6,[676.2666666666667,48.47407407407407]],[20,[601.2444444444444,36.859259259259254]],[3,[613.4518518518519,35.43703703703703]],[4,[627.9111111111112,43.73333333333333]],[19,[613.4518518518519,26.429629629629623]],[8,[667.2592592592594,52.029629629629625]],[24,[605.998353909465,33.79094650205761]],[1,[606.3407407407408,47.76296296296296]],[12,[683.3777777777777,50.48888888888889]],[15,[677.925925925926,46.222222222222214]],[9,[642.4888888888889,44.44444444444444]],[7,[684.4444444444445,46.1037037037037]],[2,[603.4962962962964,36.977777777777774]],[16,[661.0962962962963,35.792592592592584]],[23,[608.5794238683127,44.82633744855967]]]},"segments":{"add":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26],"remove":[],"start_point":[[14,14],[5,5],[19,19],[17,17],[15,15],[11,11],[21,21],[23,23],[8,8],[9,9],[12,12],[16,16],[7,7],[20,20],[1,1],[25,25],[6,6],[22,22],[13,13],[18,18],[2,2],[4,4],[26,26],[3,3],[24,24],[10,10]],"end_point":[[16,17],[25,26],[22,23],[4,5],[11,12],[5,6],[20,21],[12,13],[13,14],[3,4],[6,7],[1,2],[10,11],[18,19],[24,25],[9,10],[2,3],[21,22],[17,18],[23,24],[19,20],[14,15],[8,9],[26,1],[15,16],[7,8]],"handle_primary":[[21,[0.0,0.0]],[20,[-1.5407407407407163,8.651851851851852]],[13,[0.0,0.0]],[2,[2.1333333333333258,-5.68888888888889]],[14,[-10.90370370370374,-2.6074074074074076]],[9,[0.0,0.0]],[18,[-3.437037037037044,-4.148148148148145]],[16,[-5.214814814814758,-1.3037037037037038]],[8,[-10.666666666666629,-0.7111111111111157]],[17,[-6.992592592592587,2.962962962962962]],[22,[0.0,0.0]],[3,[2.9629629629629335,4.385185185185186]],[1,[0.0,0.0]],[10,[2.251851851851825,2.2518518518518533]],[25,[0.18814026836287212,2.510418336797158]],[19,[-3.3185185185185446,-1.1851851851851831]],[12,[6.9925925925927,-4.740740740740748]],[26,[0.0,0.0]],[5,[10.311111111111131,0.5925925925925952]],[11,[3.318518518518431,-0.11851851851851336]],[4,[6.992592592592587,-0.23703703703703383]],[23,[-2.2123456790121736,-2.3967078189300537]],[6,[4.5037037037037635,1.1851851851851831]],[24,[0.0,0.0]],[7,[0.0,0.0]],[15,[-2.844444444444548,-0.829629629629629]]],"handle_end":[[25,[0.0,0.0]],[20,[0.0,0.0]],[8,[9.36296296296291,-2.4888888888888943]],[5,[-4.5037037037037635,-1.1851851851851904]],[1,[-2.1333333333333258,5.68888888888889]],[7,[10.666666666666629,0.7111111111111086]],[24,[-0.13898543393838736,-1.8545289902200464]],[10,[-3.318518518518431,0.11851851851851336]],[2,[-2.9629629629629335,-4.385185185185186]],[13,[10.90370370370374,2.6074074074074076]],[12,[-3.0814814814815463,-9.48148148148148]],[4,[-10.311111111111131,-0.5925925925925952]],[19,[1.5407407407407163,-8.651851851851855]],[26,[0.0,0.0]],[22,null],[21,[0.0,0.0]],[11,[-6.9925925925927,4.740740740740748]],[15,[5.214814814814758,1.3037037037037038]],[18,[3.3185185185185446,1.1851851851851831]],[17,[3.437037037037044,4.148148148148145]],[6,[0.0,0.0]],[23,[0.0,0.0]],[3,[-6.992592592592587,0.23703703703703383]],[16,[6.992592592592587,-2.962962962962962]],[14,[2.844444444444548,0.829629629629629]],[9,[-2.251851851851825,-2.2518518518518533]]],"stroke":[[18,0],[7,0],[13,0],[15,0],[9,0],[12,0],[26,0],[16,0],[17,0],[25,0],[23,0],[21,0],[24,0],[22,0],[5,0],[3,0],[20,0],[11,0],[1,0],[8,0],[6,0],[4,0],[14,0],[2,0],[10,0],[19,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":26}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2422139482859833437,{"inputs":[{"Node":{"node_id":14537754528543289381,"output_index":0,"lambda":false}},{"Node":{"node_id":172538270105470471,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4372998635946271235,{"inputs":[{"Node":{"node_id":13481022631108980683,"output_index":0,"lambda":false}},{"Node":{"node_id":2126710823743005151,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[542361600097372754,{"inputs":[{"Node":{"node_id":17971411534648521628,"output_index":0,"lambda":false}},{"Node":{"node_id":6867142265138950838,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14888395629683671889,{"inputs":[{"Node":{"node_id":4341772758799935306,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[2698266912167150713,{"inputs":[{"Node":{"node_id":3165571685352930240,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[17324767436949538365,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6],"remove":[],"delta":[[6,[289.7777777777778,503.1111111111111]],[2,[362.22222222222223,512.0]],[5,[119.1111111111111,456.44444444444446]],[3,[158.66666666666669,419.55555555555554]],[1,[503.11111111111114,614.6666666666666]],[4,[150.22222222222223,429.3333333333333]]]},"segments":{"add":[1,2,3,4,5,6],"remove":[],"start_point":[[1,1],[4,4],[6,6],[5,5],[3,3],[2,2]],"end_point":[[3,4],[5,6],[1,2],[2,3],[4,5],[6,1]],"handle_primary":[[5,[0.0,0.0]],[6,[89.85096850895411,61.20347364650138]],[3,[0.0,0.0]],[4,[0.0,0.0]],[2,[-52.888888888888914,-48.44444444444446]],[1,[0.0,0.0]]],"handle_end":[[4,[7.1111111111111,-35.55555555555554]],[1,[52.888888888888914,48.44444444444446]],[6,[0.8888888888888005,-0.4444444444444571]],[5,[-89.85096850895414,-61.20347364650138]],[3,[0.0,0.0]],[2,[76.0,-1.7777777777777717]]],"stroke":[[2,0],[5,0],[6,0],[1,0],[3,0],[4,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":6}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[1659518581611333812,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17],"remove":[],"delta":[[12,[858.1618655692731,310.6063100137174]],[3,[917.991769547325,333.4320987654321]],[6,[812.2469135802468,182.5185185185185]],[14,[885.9039780521264,331.0617283950617]],[7,[773.7942386831274,177.119341563786]],[4,[869.1358024691356,247.17695473251027]],[1,[889.8106995884773,368.4609053497942]],[8,[809.349794238683,192.0]],[11,[865.1851851851853,248.6255144032922]],[17,[866.172839506173,375.11111111111114]],[10,[856.2304526748969,234.40329218106996]],[5,[838.3209876543208,205.6954732510288]],[2,[913.2510288065844,355.55555555555554]],[13,[872.1207133058986,331.2373113854595]],[16,[854.5185185185187,346.46913580246917]],[15,[872.9108367626887,333.08093278463645]],[9,[838.4526748971191,213.46502057613168]]]},"segments":{"add":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17],"remove":[],"start_point":[[1,1],[4,4],[13,13],[6,6],[17,17],[14,14],[7,7],[3,3],[2,2],[16,16],[10,10],[12,12],[15,15],[5,5],[8,8],[9,9],[11,11]],"end_point":[[7,8],[9,10],[6,7],[3,4],[10,11],[12,13],[5,6],[16,17],[8,9],[11,12],[15,16],[1,2],[2,3],[14,15],[4,5],[17,1],[13,14]],"handle_primary":[[7,[6.584362139917744,1.0534979423868265]],[10,[7.506172839506121,6.452674897119351]],[17,[4.279835390946232,0.32921810699582466]],[15,[-5.267489711934104,1.4924554183813257]],[14,[-5.267489711934104,0.0]],[9,[6.189300411522595,6.97942386831275]],[3,[-10.72985850116538,-29.20905925317203]],[8,[14.748971193415628,7.242798353909478]],[11,[1.9314128943758533,32.395061728395035]],[4,[-8.03292181069969,-10.008230452674894]],[5,[-6.320987654321016,-8.164609053497912]],[16,[0.0,0.0]],[6,[-10.930041152263357,-4.213991769547334]],[12,[6.935528120713343,13.080932784636502]],[2,[7.637860082304428,-3.423868312757179]],[13,[7.111111111111086,-2.72153635116598]],[1,[9.349794238683105,-4.213991769547306]]],"handle_end":[[11,[0.0,0.0]],[17,[-9.349794238683105,4.213991769547306]],[9,[-7.506172839506121,-6.452674897119351]],[15,[0.0,0.0]],[16,[-8.098765432098958,-2.1728395061728634]],[12,[0.0,0.0]],[4,[6.320987654321016,8.164609053497912]],[8,[-6.189300411522595,-6.97942386831275]],[7,[-14.748971193415628,-7.242798353909478]],[2,[7.1111111111111995,19.35802469135808]],[1,[-7.637860082304542,3.423868312757179]],[10,[0.0,0.0]],[13,[0.0,0.0]],[6,[0.0,0.0]],[5,[10.930041152263357,4.213991769547334]],[3,[8.03292181069969,10.008230452674894]],[14,[5.267489711934104,-1.4924554183813257]]],"stroke":[[11,0],[10,0],[7,0],[14,0],[17,0],[9,0],[15,0],[3,0],[8,0],[1,0],[6,0],[16,0],[4,0],[2,0],[12,0],[5,0],[13,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":17}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4105711298139980122,{"inputs":[{"Node":{"node_id":1162381870526064378,"output_index":0,"lambda":false}},{"Node":{"node_id":1272070255512697108,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10415872992231003638,{"inputs":[{"Node":{"node_id":8375495949882478840,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[10587073897090054035,{"inputs":[{"Node":{"node_id":8814059393325469059,"output_index":0,"lambda":false}},{"Node":{"node_id":907841922684377912,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4422453582814483232,{"inputs":[{"Node":{"node_id":4577638792388493935,"output_index":0,"lambda":false}},{"Node":{"node_id":431994205232245356,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14817659161913199655,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[3,[726.8148148148148,1023.9999999999998]],[2,[725.3333333333333,985.7777777777776]],[1,[796.148148148148,723.8518518518517]]]},"segments":{"add":[1,2,3],"remove":[],"start_point":[[3,3],[1,1],[2,2]],"end_point":[[3,1],[2,3],[1,2]],"handle_primary":[[2,[0.0,0.0]],[3,[0.0,0.0]],[1,[0.0,0.0]]],"handle_end":[[2,[0.0,0.0]],[3,[-75.55555555555566,240.59259259259304]],[1,[9.777777777777828,-73.18518518518522]]],"stroke":[[2,0],[3,0],[1,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":3}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[8766106989344197438,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6],"remove":[],"delta":[[4,[146.5679012345679,204.44444444444449]],[3,[153.58712172411558,204.8434307274338]],[5,[155.85185185185185,211.55555555555557]],[1,[197.33333333333337,212.5432098765432]],[6,[184.49382716049385,218.2716049382716]],[2,[172.64197530864195,208.98765432098767]]]},"segments":{"add":[1,2,3,4,5,6],"remove":[],"start_point":[[5,5],[6,6],[2,2],[1,1],[4,4],[3,3]],"end_point":[[3,4],[6,1],[4,5],[1,2],[5,6],[2,3]],"handle_primary":[[4,[0.0,0.0]],[2,[-7.703703703703667,-1.1851851851851904]],[1,[0.0,0.0]],[3,[-5.834035304362487,0.7861989021958493]],[6,[3.160493827160479,-0.9876543209876444]],[5,[8.493827160493822,2.3703703703703525]]],"handle_end":[[4,[-8.493827160493794,-2.370370370370381]],[6,[-3.160493827160479,1.9753086419753456]],[5,[-3.1604938271605363,0.9876543209877012]],[1,[7.703703703703724,1.1851851851852189]],[2,[5.834035304362487,-0.7861989021958493]],[3,[0.0,0.0]]],"stroke":[[6,0],[5,0],[3,0],[1,0],[2,0],[4,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":6}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7466034304713056391,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[3,[636.4372010299622,153.9035515500083]],[1,[635.2478000597847,135.0597939750059]],[2,[635.5072483424783,152.80078149291265]],[4,[637.4252384335797,135.01742888696126]]]},"segments":{"add":[1,2,3,4],"remove":[],"start_point":[[3,3],[1,1],[2,2],[4,4]],"end_point":[[3,4],[1,2],[4,1],[2,3]],"handle_primary":[[3,[1.020097146128478,-12.422679731687992]],[2,[0.0,0.0]],[4,[0.0,0.0]],[1,[0.0,0.0]]],"handle_end":[[1,[0.4153244360613826,-11.397946559213551]],[3,null],[4,[1.1169817316086892,-0.21205734949143107]],[2,[-0.5579820762119425,-0.504231587867622]]],"stroke":[[2,0],[4,0],[1,0],[3,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":4}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3636653585682494814,{"inputs":[{"Node":{"node_id":11565160497886435388,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.5},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[172538270105470471,{"inputs":[{"Node":{"node_id":9276497172451351253,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[10928540355449103287,{"inputs":[{"Node":{"node_id":18190631752493248867,"output_index":0,"lambda":false}},{"Node":{"node_id":12554368619682347699,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11632506522064533635,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7],"remove":[],"delta":[[6,[208.0,903.0]],[2,[113.33333333333331,859.3333333333333]],[5,[336.66666666666663,799.3333333333334]],[1,[40.66666666666663,1022.6666666666666]],[4,[397.3333333333333,770.6666666666666]],[3,[299.33333333333326,775.3333333333333]],[7,[145.33333333333331,1022.6666666666666]]]},"segments":{"add":[1,2,3,4,5,6,7],"remove":[],"start_point":[[6,6],[7,7],[1,1],[4,4],[5,5],[3,3],[2,2]],"end_point":[[3,4],[1,2],[7,1],[2,3],[4,5],[5,6],[6,7]],"handle_primary":[[4,[0.0,0.0]],[7,[0.0,0.0]],[6,[0.0,0.0]],[3,[65.33333333333337,-6.0]],[1,[0.0,0.0]],[5,[-40.66666666666663,12.0]],[2,[58.666666666666686,-57.33333333333326]]],"handle_end":[[5,[35.666666666666686,-46.66666666666674]],[7,[0.0,1.3333333333333712]],[3,[0.0,0.0]],[4,[40.66666666666663,-12.0]],[6,[18.00000000000003,-55.33333333333326]],[2,[-65.33333333333337,6.0]],[1,[-58.666666666666686,57.333333333333144]]],"stroke":[[5,0],[6,0],[4,0],[2,0],[1,0],[3,0],[7,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":7}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15498700602024283966,{"inputs":[{"Node":{"node_id":15466714490303763249,"output_index":0,"lambda":false}},{"Node":{"node_id":9847383247226990698,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[9470742171134780193,{"inputs":[{"Node":{"node_id":15126865253122550765,"output_index":0,"lambda":false}},{"Node":{"node_id":10270446074640675342,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10795820039540504703,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19],"remove":[],"delta":[[19,[540.4444444444445,70.22222222222221]],[16,[451.9827338808689,43.25925925925927]],[4,[604.4444444444445,138.96296296296293]],[5,[574.5185185185185,169.18518518518516]],[6,[518.2222222222222,175.7037037037037]],[18,[498.66666666666663,63.70370370370368]],[2,[591.1111111111111,92.44444444444444]],[13,[376.7623479921926,0.4130988647245317]],[1,[569.1851851851852,61.629629629629605]],[15,[432.1308820290171,20.740740740740748]],[3,[590.2222222222222,113.18518518518518]],[12,[332.131357712622,16.970215357579164]],[17,[478.3481748953775,55.407407407407405]],[14,[418.0913936876638,12.121582398270874]],[10,[396.14814814814815,88.29629629629629]],[8,[447.7037037037037,131.25925925925924]],[7,[485.6296296296296,153.48148148148147]],[11,[350.8679463145693,59.25925925925925]],[9,[418.074074074074,116.14814814814814]]]},"segments":{"add":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19],"remove":[],"start_point":[[16,16],[4,4],[9,9],[14,14],[15,15],[17,17],[6,6],[19,19],[8,8],[5,5],[7,7],[13,13],[1,1],[10,10],[3,3],[11,11],[12,12],[18,18],[2,2]],"end_point":[[3,4],[19,1],[16,17],[12,13],[1,2],[6,7],[18,19],[4,5],[10,11],[13,14],[9,10],[17,18],[15,16],[7,8],[2,3],[5,6],[11,12],[14,15],[8,9]],"handle_primary":[[4,[18.370370370370324,0.2962962962963047]],[16,[7.703703703703695,6.814814814814817]],[9,[-13.629629629629562,-7.407407407407419]],[7,[-15.407407407407447,4.444444444444457]],[15,[20.148148148148152,6.8148148148148096]],[19,[11.555555555555545,-3.851851851851848]],[2,[0.0,0.0]],[18,[13.333333333333371,4.148148148148152]],[1,[12.848891737595522,5.11227609582204]],[8,[-9.481481481481524,-12.740740740740762]],[14,[0.0,0.0]],[6,[-14.222222222222172,-11.851851851851848]],[12,[4.019883543587866,-14.744727738229416]],[10,[-13.333333333333371,-8.59259259259261]],[3,[-6.518518518518476,13.3333333333333]],[17,[10.962962962963047,12.148148148148124]],[13,[41.32904569547122,11.708483533546342]],[5,[-13.629629629629562,5.925925925925924]],[11,[-11.259259259259125,-10.962962962962962]]],"handle_end":[[6,[15.407407407407334,-4.444444444444457]],[3,[-18.370370370370324,-0.2962962962963047]],[8,[13.629629629629562,7.407407407407419]],[18,[-11.555555555555545,3.851851851851848]],[9,[13.333333333333371,8.59259259259261]],[13,null],[2,[6.518518518518476,-13.333333333333314]],[19,[-12.030418259761518,-4.786624476892754]],[12,null],[17,[-13.333333333333371,-4.148148148148152]],[14,[-20.14814814814821,-6.814814814814827]],[1,[-24.88888888888891,-10.666666666666655]],[10,[11.259259259259238,10.962962962963076]],[11,[-2.7704748413796665,10.16196036497552]],[5,[14.222222222222172,11.85185185185182]],[7,[9.481481481481524,12.740740740740762]],[16,[-10.96296296296299,-12.148148148148188]],[15,[-7.703703703703695,-6.8148148148148096]],[4,[13.629629629629562,-5.925925925925924]]],"stroke":[[16,0],[6,0],[3,0],[8,0],[12,0],[17,0],[11,0],[14,0],[13,0],[2,0],[10,0],[19,0],[1,0],[15,0],[5,0],[4,0],[18,0],[9,0],[7,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":19}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7505360855062237520,{"inputs":[{"Node":{"node_id":17945736750161448391,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[12313564802550122052,{"inputs":[{"Node":{"node_id":13557369662261607646,"output_index":0,"lambda":false}},{"Node":{"node_id":9684857454501250999,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[8413863870096329943,{"inputs":[{"Node":{"node_id":16195626650123806176,"output_index":0,"lambda":false}},{"Node":{"node_id":5302437193964714993,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[9847383247226990698,{"inputs":[{"Node":{"node_id":3627710206997006419,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14831840560430171946,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6],"remove":[],"delta":[[3,[889.7777777777777,516.8888888888889]],[2,[831.5555555555555,737.3333333333334]],[5,[833.4814814814815,746.3703703703703]],[6,[793.7777777777777,1027.2592592592591]],[4,[893.7613168724276,509.6296296296296]],[1,[791.5555555555555,1026.6666666666663]]]},"segments":{"add":[1,2,3,4,5,6],"remove":[],"start_point":[[4,4],[5,5],[3,3],[1,1],[6,6],[2,2]],"end_point":[[3,4],[1,2],[2,3],[4,5],[5,6],[6,1]],"handle_primary":[[3,[0.0,0.0]],[1,[0.0,0.0]],[5,[-24.0,92.44444444444446]],[6,[0.0,0.0]],[2,[19.555555555555543,-74.66666666666674]],[4,[0.0,0.0]]],"handle_end":[[3,[0.0,0.0]],[4,[24.0,-92.44444444444446]],[6,[-0.14814814814815236,0.29629629629675946]],[1,[-26.4188207246807,100.8718609487812]],[2,[-22.22222222222217,89.77777777777783]],[5,[0.0,0.0]]],"stroke":[[2,0],[6,0],[4,0],[1,0],[3,0],[5,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":6}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[12473080738469616517,{"inputs":[{"Node":{"node_id":17891208858820401648,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[17133591775058457007,{"inputs":[{"Node":{"node_id":18067513817508158001,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[13163272246010991228,{"inputs":[{"Node":{"node_id":9740500978584792725,"output_index":0,"lambda":false}},{"Node":{"node_id":10253927692147706615,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15286091228862934481,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7],"remove":[],"delta":[[6,[661.2894375857338,26.381344307270236]],[1,[623.1001371742112,22.694101508916333]],[7,[637.0589849108368,29.980795610425247]],[3,[638.5953360768175,27.56652949245542]],[5,[684.554183813443,27.654320987654327]],[4,[665.7229080932784,23.79149519890261]],[2,[627.0946502057614,23.00137174211249]]]},"segments":{"add":[1,2,3,4,5,6,7],"remove":[],"start_point":[[7,7],[6,6],[2,2],[4,4],[5,5],[1,1],[3,3]],"end_point":[[7,1],[6,7],[1,2],[4,5],[5,6],[3,4],[2,3]],"handle_primary":[[2,[2.150891632373032,1.5802469135802468]],[4,[6.672153635116501,-0.35116598079560646]],[3,[5.3991769547326385,0.13168724279836042]],[5,[0.0,0.0]],[1,[0.0,0.0]],[7,[-6.089851956901498,-0.48236451143773706]],[6,[-11.456790123456813,0.9657064471879302]]],"handle_end":[[5,[11.456790123456813,-0.9657064471879336]],[6,[4.433470507544598,0.35116598079561]],[4,[-0.9218106995884908,-1.0534979423868336]],[3,[-6.672153635116501,0.35116598079560646]],[7,[2.194787379972581,3.906721536351163]],[2,[-5.486565700800156,-0.13381867562927496]],[1,[-2.150891632373032,-1.5802469135802468]]],"stroke":[[2,0],[7,0],[1,0],[6,0],[5,0],[3,0],[4,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":7}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3165571685352930240,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[2,[641.3926773385256,156.76403071818197]],[1,[639.0431812985823,135.02706332876082]],[4,[641.1783537148203,135.11412115589184]],[3,[642.0732703685807,156.78028060137643]]]},"segments":{"add":[1,2,3,4],"remove":[],"start_point":[[1,1],[3,3],[4,4],[2,2]],"end_point":[[2,3],[4,1],[1,2],[3,4]],"handle_primary":[[2,[0.0,0.0]],[3,[-0.4020858660272779,-10.361367902183218]],[4,[0.0,0.0]],[1,[0.0,0.0]]],"handle_end":[[2,[-0.29793124344723765,0.12588207707705124]],[4,[1.0850699611588652,-0.2123114466060372]],[3,null],[1,[-0.08991158554488266,-10.211393405397416]]],"stroke":[[1,0],[4,0],[2,0],[3,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":4}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13014916927589286309,{"inputs":[{"Node":{"node_id":2044103368441997753,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"u32","alias":null}},"import_index":2}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::PoissonDiskPointsNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15815816861435910950,{"inputs":[{"Node":{"node_id":4105711298139980122,"output_index":0,"lambda":false}},{"Node":{"node_id":17815494794630739611,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15798070933198867970,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7,8,9,10,11,12],"remove":[],"delta":[[4,[536.0,522.2222222222221]],[1,[595.1111111111111,513.3333333333333]],[5,[449.99999999999994,445.3333333333333]],[9,[424.44444444444446,340.0]],[2,[642.2222222222222,536.8888888888889]],[7,[384.7140020398532,440.0243218219409]],[11,[588.6666666666665,453.3333333333333]],[12,[660.0,500.66666666666663]],[8,[350.6666666666667,340.0]],[10,[508.88888888888886,389.33333333333337]],[3,[598.6666666666666,547.1111111111111]],[6,[438.18064449587104,508.2403828865154]]]},"segments":{"add":[1,2,3,4,5,6,7,8,9,10,11,12],"remove":[],"start_point":[[11,11],[12,12],[1,1],[8,8],[4,4],[3,3],[2,2],[7,7],[9,9],[6,6],[5,5],[10,10]],"end_point":[[1,2],[4,5],[2,3],[7,8],[9,10],[12,1],[10,11],[6,7],[5,6],[11,12],[3,4],[8,9]],"handle_primary":[[8,[-46.969945387028645,-26.215783471829923]],[5,[0.0,0.0]],[7,[5.531031978208716,-44.24825582567013]],[12,[-31.999999999999886,10.666666666666686]],[2,[0.0,0.0]],[11,[22.666666666666856,18.0]],[3,[-18.370370370370324,2.1728395061728634]],[6,[0.0,0.0]],[9,[24.0,8.0]],[10,[25.481481481481467,20.4444444444444]],[1,[0.0,0.0]],[4,[-25.28395061728401,-13.827160493827025]]],"handle_end":[[8,[-24.0,-8.0]],[11,[-17.185185185185105,5.925925925925867]],[2,[18.370370370370324,-2.1728395061728634]],[4,[0.0,0.0]],[3,[25.283950617284063,13.827160493827025]],[1,[-58.22222222222217,-1.3333333333332575]],[12,null],[9,[-25.481481481481467,-20.4444444444444]],[7,[28.6666666666668,16.000000000000057]],[6,[-4.764895727801786,38.11916582241446]],[5,[0.0,0.0]],[10,[-23.199803616588156,-18.42337346023163]]],"stroke":[[11,0],[1,0],[7,0],[2,0],[12,0],[10,0],[8,0],[5,0],[6,0],[3,0],[9,0],[4,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":12}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11481949351661484921,{"inputs":[{"Node":{"node_id":15303587427289959766,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[6672826052605647592,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7,8,9,10,11,12],"remove":[],"delta":[[7,[591.0123456790125,60.40054869684499]],[4,[600.0548696844994,115.53360768175584]],[3,[605.4979423868314,125.19067215363512]],[12,[613.7991159884164,125.99055022100288]],[6,[594.172839506173,82.87517146776406]],[9,[593.3827160493829,85.77229080932784]],[10,[599.4403292181071,108.68587105624144]],[8,[585.8326474622772,72.60356652949247]],[2,[614.2716726786227,123.52371759047573]],[11,[599.381801554641,127.00502972107913]],[5,[603.127572016461,99.64334705075449]],[1,[617.5253772290811,122.03017832647464]]]},"segments":{"add":[1,2,3,4,5,6,7,8,9,10,11,12],"remove":[],"start_point":[[6,6],[2,2],[4,4],[12,12],[1,1],[5,5],[11,11],[3,3],[8,8],[9,9],[10,10],[7,7]],"end_point":[[12,1],[2,3],[10,11],[4,5],[7,8],[3,4],[6,7],[1,2],[9,10],[11,12],[8,9],[5,6]],"handle_primary":[[12,[2.3801249809480396,-1.7168114616673904]],[7,[0.0,0.0]],[6,[-6.145404663923159,-8.076817558299041]],[10,[-2.575217192501441,8.77914951989024]],[11,[3.960543177125487,4.094798878044912]],[9,[3.599451303154978,4.477366255144034]],[3,[-4.594421582076166,-1.1705532693187024]],[2,[-1.2820759681926577,0.7008681959453185]],[4,[0.8779149519890552,-4.477366255144034]],[5,[-0.8779149519890552,-4.477366255144048]],[1,[0.0,0.0]],[8,[0.6346981736430735,5.019885555177211]]],"handle_end":[[2,[3.396564570446685,0.8653667695405147]],[8,[-3.599451303154978,-4.477366255144034]],[6,[-6.057613168724288,9.305898491083669]],[7,[-0.9657064471879266,-7.637860082304528]],[11,[-2.036412917146322,1.4688880058104417]],[10,[-4.118548609866821,-4.258160427150372]],[1,[1.3006147436874471,-0.7110027265491681]],[4,[0.8779149519890552,4.47736625514402]],[5,[6.145404663923159,8.076817558299041]],[9,[3.3684073442221916,-11.48320685530176]],[12,[0.0,0.0]],[3,[-0.8779149519890552,4.477366255144034]]],"stroke":[[8,0],[10,0],[4,0],[11,0],[5,0],[3,0],[6,0],[1,0],[9,0],[7,0],[12,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":12}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7385465194555106679,{"inputs":[{"Node":{"node_id":5009664118231399060,"output_index":0,"lambda":false}},{"Node":{"node_id":6416452251137958677,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[9425359632144678256,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5],"remove":[],"delta":[[3,[622.6042778031804,84.90413046791649]],[4,[612.3749428440786,88.61088248742568]],[5,[606.9918024691358,101.68414814814815]],[1,[610.2608816540582,107.73159867034722]],[2,[615.0086877000457,93.76131687242795]]]},"segments":{"add":[1,2,3,4,5],"remove":[],"start_point":[[4,4],[5,5],[3,3],[2,2],[1,1]],"end_point":[[4,5],[1,2],[3,4],[2,3],[5,1]],"handle_primary":[[1,[0.0,0.0]],[2,[3.21902149062646,-3.511659807956093]],[3,[-0.6242950769699291,-0.9364426154549648]],[4,[-3.0889600162577153,2.952395468170536]],[5,[0.0,0.0]]],"handle_end":[[3,[2.992367941940074,-2.86007378029646]],[1,[-3.21902149062646,3.5116598079561214]],[5,[-2.1454520955559246,-3.1101486881290583]],[4,[-0.5623782142248501,-6.258066225952547]],[2,[0.15607376924265282,0.7543565513387165]]],"stroke":[[2,0],[5,0],[1,0],[3,0],[4,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":5}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15177845878727456758,{"inputs":[{"Node":{"node_id":14225285635863713990,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[5555007473125503522,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7],"remove":[],"delta":[[7,[722.6215515927449,59.58116140832189]],[1,[721.7241274196006,63.248894985520494]],[2,[724.7285474775185,66.64349946654472]],[6,[724.0262155159273,62.468526139308025]],[4,[725.0797134583142,72.96448712086573]],[5,[726.0551745160798,67.30681298582532]],[3,[723.7140679774425,72.106081390032]]]},"segments":{"add":[1,2,3,4,5,6,7],"remove":[],"start_point":[[2,2],[6,6],[5,5],[3,3],[4,4],[1,1],[7,7]],"end_point":[[3,4],[7,1],[5,6],[1,2],[4,5],[2,3],[6,7]],"handle_primary":[[4,[0.6633135192806776,-0.8584057308337094]],[7,[-1.014479500076277,0.3901844231062413]],[2,[0.546258192348887,2.106995884773667]],[5,[-0.585276634659408,-3.8628257887517066]],[3,[-1.287608596250493,1.7558299039780536]],[1,[0.0,0.0]],[6,[-0.03901844231063478,-1.2485901539399509]]],"handle_end":[[3,[-0.6633135192806776,0.8584057308337094]],[1,[-0.501794076076294,-1.9354914362939013]],[7,[0.07803688462126956,-0.03901844231062768]],[4,[0.585276634659408,3.8628257887517066]],[5,[0.03901844231063478,1.2485901539399509]],[2,[1.852405339488314,-2.526007281120613]],[6,[1.014479500076277,-0.39018442310623414]]],"stroke":[[4,0],[6,0],[2,0],[3,0],[5,0],[7,0],[1,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":7}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[17529660518597229229,{"inputs":[{"Node":{"node_id":3802858053991775169,"output_index":0,"lambda":false}},{"Node":{"node_id":4332145463108161926,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":4.0},"exposed":false}},{"Value":{"tagged_value":{"F64":40.0},"exposed":false}},{"Value":{"tagged_value":{"F64":-30.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[16446146761452576438,{"inputs":[{"Node":{"node_id":12131058586835568367,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"DVec2":[619.1444612416404,54.266956717585614]},"exposed":false}},{"Value":{"tagged_value":{"F64":-0.6118784},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[5.617278800347149,2.5068847538738956]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[1.1858656806102035e-16,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.5,0.5]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[454416440369338250,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2],"remove":[],"delta":[[2,[733.7777777777778,518.6666666666666]],[1,[696.0,593.3333333333333]]]},"segments":{"add":[1],"remove":[],"start_point":[[1,1]],"end_point":[[1,2]],"handle_primary":[[1,[0.0,0.0]]],"handle_end":[[1,[-18.666666666666515,26.66666666666663]]],"stroke":[[1,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15038739378867834454,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7],"remove":[],"delta":[[3,[691.5336076817558,52.14814814814816]],[4,[704.965706447188,54.25514403292181]],[6,[687.4951989026064,54.518518518518526]],[2,[667.4787379972565,58.20576131687244]],[5,[704.6145404663924,55.39643347050756]],[1,[654.3978052126201,51.621399176954746]],[7,[662.3868312757203,59.61042524005489]]]},"segments":{"add":[1,2,3,4,5,6,7],"remove":[],"start_point":[[2,2],[6,6],[1,1],[7,7],[5,5],[3,3],[4,4]],"end_point":[[3,4],[4,5],[7,1],[5,6],[1,2],[6,7],[2,3]],"handle_primary":[[3,[7.723134415788309,-0.2640387834457485]],[2,[6.145404663923159,-1.0534979423868336]],[5,[0.0,0.0]],[4,[0.0,0.0]],[1,[0.0,0.0]],[7,[-4.546573253919632,-2.2347563451469625]],[6,[-10.156808190486911,1.6663513437517778]]],"handle_end":[[7,[0.0,0.08779149519890694]],[5,[11.237311385459408,-1.8436213991769537]],[3,null],[1,[-5.875074923313605,1.0071557011394745]],[6,[5.179698216735233,2.5459533607681664]],[2,[-10.271604938271594,0.35116598079560646]],[4,[0.0,0.0]]],"stroke":[[7,0],[2,0],[4,0],[1,0],[5,0],[6,0],[3,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":7}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4493274523708782092,{"inputs":[{"Node":{"node_id":15239301303367148581,"output_index":0,"lambda":false}},{"Node":{"node_id":12880230498984021417,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14982414026754548178,{"inputs":[{"Node":{"node_id":13045580349734858212,"output_index":0,"lambda":false}},{"Node":{"node_id":4332145463108161926,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":10.0},"exposed":false}},{"Value":{"tagged_value":{"F64":-25.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[6973438081601736688,{"inputs":[{"Node":{"node_id":11630078441485655672,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[4577638792388493935,{"inputs":[{"Node":{"node_id":3170924135668664007,"output_index":0,"lambda":false}},{"Node":{"node_id":6292009934909381201,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[12131058586835568367,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[3,[0.443655685420585,0.8388279058567918]],[4,[0.022131022857413415,0.4190687668825941]],[1,[0.6081211287919952,-0.2081641356766983]],[2,[1.0389965338526328,0.5311836299154763]]]},"segments":{"add":[1,2,3,4],"remove":[],"start_point":[[2,2],[4,4],[3,3],[1,1]],"end_point":[[1,2],[4,1],[2,3],[3,4]],"handle_primary":[[3,[-0.29501938196342326,-0.04735956037402645]],[1,[0.297407817404018,0.05174926937677715]],[2,[-0.06483434986356718,0.26682960488486684]],[4,[0.021131345375600137,-0.27179882337964756]]],"handle_end":[[4,[-0.38805268271111915,-0.0675215701634326]],[3,[-0.02113134537560013,0.27179882337964756]],[2,[0.2950193819634199,0.04735956037402589]],[1,[0.07365905854782184,-0.30314821587423946]]],"stroke":[[4,0],[1,0],[3,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":4}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11659756061767599421,{"inputs":[{"Node":{"node_id":8766106989344197438,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[5140869461760168364,{"inputs":[{"Node":{"node_id":17118107476414252025,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[1157261387411722141,{"inputs":[{"Node":{"node_id":4577174813962563383,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[8543051864256131356,{"inputs":[{"Node":{"node_id":5002654561220917457,"output_index":0,"lambda":false}},{"Node":{"node_id":4332145463108161926,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":300.0},"exposed":false}},{"Value":{"tagged_value":{"F64":-100.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[5185036609290210853,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29],"remove":[],"delta":[[26,[722.5825331504344,57.31809175430575]],[3,[703.7366255144034,54.694101508916326]],[2,[697.9423868312758,64.79012345679013]],[18,[716.7736625514402,54.9135802469136]],[4,[704.9657064471878,54.25514403292179]],[17,[713.3351623228167,47.46593507087334]],[22,[719.6171315348269,59.659198292943145]],[5,[705.102270995275,59.269013869836904]],[29,[694.0600518213687,74.40816948635879]],[14,[711.9695168419447,48.57796067672611]],[1,[687.846364883402,65.58024691358025]],[9,[702.2222222222223,38.38683127572017]],[15,[703.604938271605,68.21399176954733]],[19,[705.9094650205762,70.25514403292182]],[27,[718.680688919372,68.71147690900777]],[10,[696.5925925925927,33.728395061728385]],[13,[706.9556470050298,39.272062185642426]],[25,[719.8512421886905,54.19661636945587]],[21,[716.1444901691814,49.82655083066605]],[24,[719.0123456790122,66.6337448559671]],[11,[697.7283950617284,31.30864197530864]],[7,[701.785703398872,67.26779454351473]],[12,[698.2935528120714,34.35573845450388]],[8,[709.8600823045268,50.83127572016461]],[28,[702.2539247065995,73.00350556317633]],[20,[716.6907483615302,62.66361835086114]],[16,[713.7448559670781,60.37860082304528]],[6,[695.152568206066,67.34583142813594]],[23,[711.5061728395062,69.99176954732509]]]},"segments":{"add":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29],"remove":[],"start_point":[[20,20],[17,17],[12,12],[11,11],[6,6],[15,15],[7,7],[21,21],[28,28],[8,8],[2,2],[24,24],[10,10],[13,13],[16,16],[23,23],[18,18],[5,5],[22,22],[9,9],[26,26],[4,4],[1,1],[29,29],[19,19],[25,25],[27,27],[3,3],[14,14]],"end_point":[[12,13],[3,4],[21,22],[10,11],[8,9],[1,2],[23,24],[9,10],[5,6],[29,1],[4,5],[6,7],[27,28],[14,15],[13,14],[25,26],[24,25],[2,3],[26,27],[20,21],[17,18],[18,19],[11,12],[19,20],[16,17],[15,16],[7,8],[28,29],[22,23]],"handle_primary":[[16,[2.9207548934437,-5.774876595401999]],[15,[0.0,0.0]],[27,[-4.128769232802142,3.294230770852593]],[6,[0.0,0.0]],[24,[2.106995884773596,-3.0044200579180256]],[5,[-1.1705532693187024,3.0044200579180043]],[26,[0.8664211612748431,3.3573819999397045]],[18,[-0.7242798353908029,5.860082304526735]],[29,[0.0,0.0]],[9,[-3.823807346440958,-1.6387745770461848]],[1,[0.0,0.0]],[8,[1.1368683772161605e-13,-7.4135040390184415]],[28,[-7.920532726374063,-0.13055823175342596]],[12,[1.5089163237310004,2.3850022862368547]],[20,[2.536198750190465,-6.516079865874104]],[2,[1.5646505637769224,-1.2302214356413188]],[17,[0.0,0.0]],[10,[-0.04481007342064913,-1.8372595419893116]],[11,[0.0,0.0]],[23,[0.0,0.0]],[13,[2.1939750755697105,1.3128956217623369]],[3,[0.0,0.0]],[19,[0.0,0.0]],[25,[0.0,0.0]],[22,[-1.7948483462886315,6.047858558146615]],[21,[0.0,0.0]],[7,[3.3946044810244302,-1.8728852309099435]],[14,[0.9193720469440904,5.347965249199831]],[4,[0.0,0.0]]],"handle_end":[[18,[9.169333942996444,-4.409083981100437]],[13,[-0.7923207898123792,-4.608911119518574]],[24,[2.980033531474078,4.338363054412447]],[3,[0.0,0.0]],[14,[7.30864197530866,-5.333333333333336]],[6,[-3.208476806721251,1.7701941002599142]],[29,[0.009754610577488164,0.048773052888265056]],[1,[-2.555707971345896,2.0094497789970944]],[2,[0.5267489711934559,6.320987654320987]],[5,[6.516079865874076,-2.4581618655692807]],[20,[1.638774577046206,1.5607376924249363]],[7,[-1.1368683772161605e-13,8.389895136005812]],[22,[2.731290961743639,-1.326627038561199]],[15,[-3.84819387288519,7.608596250571544]],[28,[0.0,0.0]],[19,[-2.536198750190465,6.516079865874104]],[23,[-2.1028230213785264,2.9984698638176326]],[25,[-0.6242950769700428,-2.419143423258646]],[10,[0.0,0.0]],[11,[-0.8654907204776237,-1.3679998781853442]],[9,[0.04481007342064913,1.837259541989333]],[17,[0.667740598959881,-5.402628482494777]],[16,[1.1705532693187024,1.8728852309099224]],[26,[3.66773357719876,-2.926383173296756]],[8,[5.150019007352512,2.2071510031511608]],[4,[1.1705532693187024,-3.0044200579180043]],[27,[7.101356500533598,0.11705532693187592]],[21,[1.7948483462886315,-6.047858558146615]],[12,[-3.679926840420876,-2.202103337905797]]],"stroke":[[14,0],[3,0],[29,0],[25,0],[18,0],[12,0],[7,0],[5,0],[11,0],[16,0],[2,0],[1,0],[22,0],[23,0],[27,0],[24,0],[6,0],[26,0],[19,0],[4,0],[9,0],[10,0],[8,0],[21,0],[20,0],[13,0],[28,0],[15,0],[17,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":29}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[18190631752493248867,{"inputs":[{"Node":{"node_id":12428327489525325219,"output_index":0,"lambda":false}},{"Node":{"node_id":10375238420217738812,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16732130236852371275,{"inputs":[{"Node":{"node_id":4832236468224231783,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":6.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[8644924780109919177,{"inputs":[{"Node":{"node_id":10599660455959346550,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[5020096817747898028,{"inputs":[{"Node":{"node_id":15286091228862934481,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[2641530639940889619,{"inputs":[{"Node":{"node_id":5174744389209053970,"output_index":0,"lambda":false}},{"Node":{"node_id":14539627480594383748,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[5326536612985524219,{"inputs":[{"Node":{"node_id":15798070933198867970,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":27.0},"exposed":false}},{"Value":{"tagged_value":{"U32":9},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"u32","alias":null}},"import_index":2}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::PoissonDiskPointsNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11666664915283969027,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2],"remove":[],"delta":[[1,[802.3703703703703,580.9382716049382]],[2,[751.4074074074075,685.0370370370371]]]},"segments":{"add":[1,2],"remove":[],"start_point":[[2,2],[1,1]],"end_point":[[2,1],[1,2]],"handle_primary":[[2,[20.740740740740534,-42.469135802469054]],[1,[0.0,0.0]]],"handle_end":[[1,[27.259259259259125,-48.79012345678995]],[2,null]],"stroke":[[1,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":2}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3414873131936208778,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2],"remove":[],"delta":[[2,[697.7777777777777,954.2222222222222]],[1,[761.7777777777777,737.3333333333333]]]},"segments":{"add":[1,2],"remove":[],"start_point":[[1,1],[2,2]],"end_point":[[2,1],[1,2]],"handle_primary":[[1,[0.0,0.0]],[2,[0.0,0.0]]],"handle_end":[[1,[26.22222222222217,-158.66666666666652]],[2,[-40.0,81.33333333333326]]],"stroke":[[2,0],[1,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":2}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3686761601672683183,{"inputs":[{"Node":{"node_id":4859656512650360562,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16805628435335819723,{"inputs":[{"Node":{"node_id":10689298484366290551,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[13557369662261607646,{"inputs":[{"Node":{"node_id":3535178979443201645,"output_index":0,"lambda":false}},{"Node":{"node_id":15177845878727456758,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16339345235172368839,{"inputs":[{"Node":{"node_id":14778750092903591172,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[18214377096178867498,{"inputs":[{"Node":{"node_id":7747398671834040298,"output_index":0,"lambda":false}},{"Node":{"node_id":4332145463108161926,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":300.0},"exposed":false}},{"Value":{"tagged_value":{"F64":-100.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[3955326429435439190,{"inputs":[{"Node":{"node_id":18207065424980079673,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[2126710823743005151,{"inputs":[{"Node":{"node_id":14831840560430171946,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[11804065810513502701,{"inputs":[{"Node":{"node_id":9782123335421401489,"output_index":0,"lambda":false}},{"Node":{"node_id":17133591775058457007,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7320676248579211727,{"inputs":[{"Node":{"node_id":14817659161913199655,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[7654665057468818389,{"inputs":[{"Node":{"node_id":17378885078543074499,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[10514847656270897393,{"inputs":[{"Value":{"tagged_value":{"GraphicGroup":{"instance":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":16339345235172368839,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16434255153991868080,{"inputs":[{"Node":{"node_id":6124821161363551058,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[17207349373429328029,{"inputs":[{"Node":{"node_id":17967471489196302183,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[6867142265138950838,{"inputs":[{"Node":{"node_id":4784708315242877950,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14862049226133442027,{"inputs":[{"Node":{"node_id":16614450796751955858,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[8814059393325469059,{"inputs":[{"Node":{"node_id":15492651270767932214,"output_index":0,"lambda":false}},{"Node":{"node_id":14035980686649077716,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[17364155187784942740,{"inputs":[{"Node":{"node_id":1378578509112405,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.9019608,"green":0.8,"blue":0.6117647,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.9019608,"green":0.8,"blue":0.6117647,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[10586744777717861556,{"inputs":[{"Node":{"node_id":11417901103965737900,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[15656854169166220905,{"inputs":[{"Node":{"node_id":7821977654068146599,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"DVec2":[-5.0,22.0]},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[1.0,1.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.5,0.5]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10190227675276560561,{"inputs":[{"Node":{"node_id":2682920349304670808,"output_index":0,"lambda":false}},{"Node":{"node_id":16434255153991868080,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4909350123806022131,{"inputs":[{"Node":{"node_id":15498700602024283966,"output_index":0,"lambda":false}},{"Node":{"node_id":16536768589601337644,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10424806499648491677,{"inputs":[{"Value":{"tagged_value":{"GraphicGroup":{"instance":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":17147975601187022720,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14598755603287563819,{"inputs":[{"Node":{"node_id":7466034304713056391,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[8230694129617719636,{"inputs":[{"Node":{"node_id":4909350123806022131,"output_index":0,"lambda":false}},{"Node":{"node_id":16805628435335819723,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16175421708184657649,{"inputs":[{"Node":{"node_id":8698602280607307123,"output_index":0,"lambda":false}},{"Node":{"node_id":514796034658094296,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[18422317423856403288,{"inputs":[{"Node":{"node_id":10133176481349663495,"output_index":0,"lambda":false}},{"Node":{"node_id":12594527670567285670,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15395954548128560685,{"inputs":[{"Node":{"node_id":13475705179546695973,"output_index":0,"lambda":false}},{"Node":{"node_id":16767482995096345179,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11464423670065789907,{"inputs":[{"Node":{"node_id":8644924780109919177,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[5269304445610080925,{"inputs":[{"Node":{"node_id":3686761601672683183,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[14012583111791538162,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[3,[603.3333333333335,744.6666666666666]],[1,[248.00000000000009,884.0]],[2,[380.00000000000006,806.0]]]},"segments":{"add":[1,2],"remove":[],"start_point":[[1,1],[2,2]],"end_point":[[2,3],[1,2]],"handle_primary":[[1,[0.0,0.0]],[2,[70.80694036316174,-19.49756328840681]]],"handle_end":[[2,[-71.33333333333326,24.0]],[1,[-92.00000000000006,25.333333333333258]]],"stroke":[[2,0],[1,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4784708315242877950,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7],"remove":[],"delta":[[7,[807.0666666666666,680.1333333333332]],[1,[902.6666666666669,446.66666666666674]],[3,[592.4000000000001,852.3999999999999]],[2,[808.5333333333333,683.1555555555556]],[6,[592.0,845.3333333333333]],[4,[468.14814814814815,1025.382716049383]],[5,[464.5925925925926,1025.382716049383]]]},"segments":{"add":[1,2,3,4,5,6,7],"remove":[],"start_point":[[2,2],[1,1],[3,3],[4,4],[7,7],[6,6],[5,5]],"end_point":[[6,7],[7,1],[1,2],[2,3],[4,5],[5,6],[3,4]],"handle_primary":[[2,[-81.33333333333337,100.88888888888891]],[4,[0.0,0.0]],[6,[93.94069526511169,-85.35957406301043]],[1,[0.0,0.0]],[7,[62.39957279246403,-72.271586423759]],[3,[-91.33798434535026,86.27035509501377]],[5,[0.0,0.0]]],"handle_end":[[2,[85.857044886376,-81.09351003138556]],[6,[-87.55555555555577,101.4074074074075]],[7,[-3.466666666666697,51.33333333333326]],[1,[97.81027061870486,-121.32749415544254]],[4,[0.0,0.0]],[3,[0.0,0.0]],[5,[-102.71604938271612,93.3333333333336]]],"stroke":[[3,0],[7,0],[6,0],[4,0],[2,0],[1,0],[5,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":7}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[8375495949882478840,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7,8,9,10,11],"remove":[],"delta":[[2,[617.4278311233043,51.042625616013815]],[5,[650.6227709190673,52.93827160493828]],[8,[675.3580246913581,68.74074074074075]],[4,[642.6077325610934,47.29035208047554]],[6,[662.1234567901236,64.96570644718793]],[1,[616.0751917898693,61.31097901742621]],[7,[673.0096021947875,65.84362139917695]],[3,[628.5871056241429,46.71808159325306]],[10,[650.9056546258192,56.62876594015139]],[11,[641.3168724279836,48.02194787379973]],[9,[662.1234567901236,66.9849108367627]]]},"segments":{"add":[1,2,3,4,5,6,7,8,9,10,11],"remove":[],"start_point":[[10,10],[9,9],[2,2],[6,6],[1,1],[5,5],[8,8],[3,3],[4,4],[11,11],[7,7]],"end_point":[[3,4],[11,1],[8,9],[10,11],[5,6],[7,8],[2,3],[1,2],[9,10],[4,5],[6,7]],"handle_primary":[[2,[2.1833209230284183,-3.0691100638496778]],[8,[0.0,0.0]],[4,[2.784561671457709,0.5265657466421629]],[10,[-2.0025980353477735,-3.5689865976493422]],[3,[4.873654303444027,-0.3091793289098348]],[11,[-8.252400548696869,-0.8779149519890339]],[5,[3.160493827160508,4.6529492455418335]],[6,[5.4430727023319605,2.545953360768181]],[1,[-0.7315957933242316,0.01300614743686168]],[7,[0.0,0.0]],[9,[-4.389574759945162,-2.106995884773667]]],"handle_end":[[5,[-5.4430727023319605,-2.545953360768181]],[3,[-2.7845616714574817,-0.5265657466421203]],[1,[-2.4595700304455477,3.4574354386312436]],[6,[0.0,0.0]],[4,[-3.160493827160508,-4.6529492455418335]],[2,[-5.145487535686698,0.32642413354457744]],[8,[4.389574759945162,2.106995884773667]],[7,[0.0,0.0]],[9,[2.6272417822486887,4.682213077274824]],[10,[6.086554705109506,0.6475058196925048]],[11,[2.0257074632933154,-0.6893258141543512]]],"stroke":[[4,0],[10,0],[1,0],[11,0],[2,0],[6,0],[8,0],[5,0],[3,0],[9,0],[7,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":11}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11677503666435782605,{"inputs":[{"Node":{"node_id":12049041947382267086,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[16536768589601337644,{"inputs":[{"Node":{"node_id":4222034829755771252,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[2087303479944421366,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[1,[365.6296296296296,1025.4814814814813]],[2,[443.2592592592592,882.0740740740739]],[3,[368.59259259259255,1025.1851851851852]]]},"segments":{"add":[1,2],"remove":[],"start_point":[[1,1],[2,2]],"end_point":[[1,2],[2,3]],"handle_primary":[[2,[0.0,0.0]],[1,[0.0,0.0]]],"handle_end":[[1,[-48.59259259259255,50.07407407407413]],[2,[31.111111111111143,-96.29629629629642]]],"stroke":[[1,0],[2,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[17426609415699324395,{"inputs":[{"Node":{"node_id":15896921950407486754,"output_index":0,"lambda":false}},{"Node":{"node_id":11464423670065789907,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16450742929146919960,{"inputs":[{"Node":{"node_id":14887821801874852671,"output_index":0,"lambda":false}},{"Node":{"node_id":11899713172487274471,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[8595304668947966919,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2],"remove":[],"delta":[[2,[798.4000000000001,879.4666666666668]],[1,[810.1333333333333,731.4666666666668]]]},"segments":{"add":[1,2],"remove":[],"start_point":[[1,1],[2,2]],"end_point":[[1,2],[2,1]],"handle_primary":[[1,[0.0,0.0]],[2,[0.0,0.0]]],"handle_end":[[1,[-1.8666666666665608,-67.46666666666658]],[2,[-18.13333333333333,82.66666666666674]]],"stroke":[[1,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":2}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11451028343967836482,{"inputs":[{"Node":{"node_id":2422139482859833437,"output_index":0,"lambda":false}},{"Node":{"node_id":12531351117929704587,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[314278016428495768,{"inputs":[{"Node":{"node_id":6282972142629473139,"output_index":0,"lambda":false}},{"Node":{"node_id":5020096817747898028,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[17971411534648521628,{"inputs":[{"Value":{"tagged_value":{"GraphicGroup":{"instance":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":14862049226133442027,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13014628586360765651,{"inputs":[{"Value":{"tagged_value":{"GraphicGroup":{"instance":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":2175432926627256613,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14778750092903591172,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[3,[146.5679012345679,204.44444444444449]],[2,[149.0793650793651,202.5537918871252]],[1,[155.98219408731924,204.757705978404]]]},"segments":{"add":[1,2,3],"remove":[],"start_point":[[2,2],[3,3],[1,1]],"end_point":[[3,1],[2,3],[1,2]],"handle_primary":[[2,[-2.2695727277346123,-0.643804298125275]],[1,[-2.6135873853791907,-0.8494167367814498]],[3,[0.9278738161427498,1.2447087777524644]]],"handle_end":[[1,[1.7022700834823468,0.48287890620272833]],[2,[-1.156966490299823,-1.5520282186949146]],[3,[-0.32172621516085087,3.1233079488176827]]],"stroke":[[1,0],[2,0],[3,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":3}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[18015048324114736039,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29],"remove":[],"delta":[[20,[805.1358024691358,260.34567901234567]],[17,[757.7283950617285,217.48148148148147]],[22,[785.9753086419753,197.13580246913585]],[5,[639.8024691358025,44.24691358024691]],[28,[730.2716049382716,169.4814814814815]],[29,[705.1851851851852,106.27160493827162]],[24,[746.8641975308642,175.40740740740742]],[3,[675.3580246913581,68.74074074074075]],[14,[630.716049382716,132.3456790123457]],[21,[805.925925925926,230.9135802469136]],[2,[683.0617283950618,104.2962962962963]],[12,[603.4567901234568,92.8395061728395]],[8,[613.3333333333334,44.24691358024691]],[7,[607.2098765432099,55.308641975308646]],[18,[799.2098765432099,253.23456790123456]],[6,[617.283950617284,44.641975308641975]],[4,[654.4197530864197,54.91358024691358]],[15,[664.8888888888889,140.64197530864195]],[11,[596.9382716049383,85.13580246913581]],[10,[597.530864197531,73.08641975308642]],[1,[687.4074074074074,99.1604938271605]],[25,[737.7777777777778,170.07407407407408]],[27,[722.1728395061729,147.1604938271605]],[23,[760.8888888888889,175.80246913580248]],[26,[752.1975308641976,172.83950617283952]],[13,[616.2962962962963,115.16049382716052]],[19,[797.8271604938273,246.1234567901235]],[9,[609.3827160493827,43.65432098765433]],[16,[672.5925925925926,176.5925925925926]]]},"segments":{"add":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29],"remove":[],"start_point":[[7,7],[28,28],[14,14],[4,4],[19,19],[16,16],[9,9],[25,25],[6,6],[3,3],[22,22],[18,18],[23,23],[26,26],[12,12],[8,8],[2,2],[11,11],[17,17],[15,15],[21,21],[10,10],[24,24],[27,27],[13,13],[5,5],[29,29],[20,20],[1,1]],"end_point":[[10,11],[3,4],[9,10],[12,13],[16,17],[14,15],[7,8],[18,19],[24,25],[23,24],[29,1],[28,29],[2,3],[21,22],[19,20],[15,16],[25,26],[11,12],[26,27],[8,9],[4,5],[17,18],[1,2],[22,23],[5,6],[27,28],[20,21],[6,7],[13,14]],"handle_primary":[[8,[-1.1851851851851052,-1.1851851851851904]],[17,[20.594048174910657,8.937919170354007]],[16,[29.23456790123464,10.666666666666686]],[27,[0.0,0.0]],[6,[-8.09876543209873,4.740740740740733]],[24,[-5.3333333333332575,-2.5679012345678984]],[15,[6.913580246913625,9.87654320987656]],[10,[-6.320987654320902,4.740740740740733]],[23,[-2.5679012345678984,-0.592592592592581]],[28,[0.0,0.0]],[11,[3.3580246913580822,1.9753086419753176]],[26,[0.0,0.0]],[4,[-2.3703703703704377,-3.555555555555557]],[19,[4.543209876543187,5.925925925925952]],[5,[-9.48148148148141,0.9876543209876516]],[22,[-7.506172839506121,-7.901234567901298]],[21,[-2.5679012345678984,-9.481481481481469]],[2,[-8.120713305898448,-14.573388203017842]],[14,[5.728395061728293,2.370370370370381]],[12,[5.728395061728406,16.98765432098766]],[29,[-13.234567901234527,-3.3580246913580396]],[1,[-2.1728395061728634,1.5802469135802255]],[3,[-15.209876543209816,-1.7777777777777717]],[18,[0.0,-2.172839506172835]],[20,[0.0,0.0]],[13,[2.370370370370324,7.308641975308632]],[25,[0.0,0.0]],[9,[-14.024691358024713,15.802469135802482]],[7,[-0.9876543209876444,-4.740740740740733]]],"handle_end":[[25,[-4.740740740740762,0.790123456790127]],[9,[0.0,0.0]],[24,[0.0,0.0]],[23,[5.3333333333332575,2.5679012345678984]],[18,[0.0,0.0]],[14,[-6.913580246913625,-9.876543209876502]],[10,[-3.3580246913580822,-1.9753086419753176]],[27,[-3.7530864197531177,-7.506172839506178]],[12,[0.0,0.0]],[15,[0.0,0.0]],[8,[0.0,0.0]],[3,[2.3703703703704377,3.555555555555557]],[7,[0.0,0.0]],[2,[0.0,0.0]],[19,[0.0,0.0]],[21,[7.506172839506121,7.901234567901213]],[4,[9.48148148148141,-0.9876543209876444]],[1,[0.0,0.0]],[22,[2.5679012345678984,0.592592592592581]],[26,[19.35802469135808,26.864197530864203]],[5,[0.0,0.0]],[17,[0.0,0.0]],[6,[0.0,0.0]],[20,[2.5679012345678984,9.481481481481438]],[16,[-20.59404817491054,-8.937919170353979]],[11,[0.0,0.0]],[28,[17.580246913580254,58.07407407407402]],[29,[0.0,0.0]],[13,[-5.728395061728293,-2.370370370370381]]],"stroke":[[14,0],[4,0],[12,0],[27,0],[13,0],[19,0],[22,0],[29,0],[25,0],[23,0],[11,0],[5,0],[6,0],[18,0],[1,0],[16,0],[3,0],[8,0],[15,0],[24,0],[21,0],[26,0],[17,0],[10,0],[2,0],[20,0],[7,0],[9,0],[28,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":29}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13975451746581400000,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2],"remove":[],"delta":[[1,[835.7333333333332,786.4000000000001]],[2,[901.6,572.8]]]},"segments":{"add":[1,2],"remove":[],"start_point":[[1,1],[2,2]],"end_point":[[1,2],[2,1]],"handle_primary":[[1,[0.0,0.0]],[2,[0.0,0.0]]],"handle_end":[[1,[-22.399999999999977,109.06666666666648]],[2,[47.4666666666667,-108.26666666666664]]],"stroke":[[1,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":2}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13035777574951374461,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[1,[896.0,440.44444444444446]],[2,[833.7777777777778,573.3333333333333]],[3,[696.8888888888889,697.3333333333333]]]},"segments":{"add":[1,2],"remove":[],"start_point":[[1,1],[2,2]],"end_point":[[1,2],[2,3]],"handle_primary":[[1,[0.0,0.0]],[2,[-68.0,92.88888888888891]]],"handle_end":[[1,[68.0,-92.88888888888891]],[2,[0.0,0.0]]],"stroke":[[1,0],[2,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3827449344952693766,{"inputs":[{"Node":{"node_id":2440895173483452224,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11565160497886435388,{"inputs":[{"Node":{"node_id":7893851488963635918,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":6.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10336592647221792772,{"inputs":[{"Node":{"node_id":16051539163551573193,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[3535178979443201645,{"inputs":[{"Node":{"node_id":12838133055063962839,"output_index":0,"lambda":false}},{"Node":{"node_id":8240895922641772563,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14675232891471617236,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[1,[652.8888888888889,822.6666666666666]],[3,[483.9506172839506,1026.7654320987656]],[2,[480.7407407407408,1026.6666666666663]]]},"segments":{"add":[1,2,3],"remove":[],"start_point":[[3,3],[2,2],[1,1]],"end_point":[[2,3],[3,1],[1,2]],"handle_primary":[[1,[0.0,0.0]],[2,[0.0,0.0]],[3,[0.0,0.0]]],"handle_end":[[2,[0.0,0.0]],[3,[-143.85185185185185,150.07407407407413]],[1,[26.66666666666669,-58.666666666666515]]],"stroke":[[1,0],[2,0],[3,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":3}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14035980686649077716,{"inputs":[{"Node":{"node_id":6666260895482068061,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[421715625023770179,{"inputs":[{"Node":{"node_id":3670529450440935325,"output_index":0,"lambda":false}},{"Node":{"node_id":3150436463719911922,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2044103368441997753,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7,8],"remove":[],"delta":[[3,[747.6543209876543,394.6666666666667]],[7,[710.7160493827162,200.09876543209884]],[6,[756.7407407407409,223.40740740740748]],[2,[723.3580246913581,337.97530864197535]],[5,[793.6790123456792,258.7654320987655]],[1,[710.5185185185186,302.2222222222223]],[8,[694.5185185185187,204.8395061728396]],[4,[796.4444444444446,278.12345679012356]]]},"segments":{"add":[1,2,3,4,5,6,7,8],"remove":[],"start_point":[[6,6],[3,3],[7,7],[8,8],[5,5],[2,2],[4,4],[1,1]],"end_point":[[5,6],[2,3],[4,5],[6,7],[1,2],[8,1],[7,8],[3,4]],"handle_primary":[[6,[-22.518518518518476,-12.641975308641976]],[3,[0.0,0.0]],[5,[-5.135802469135797,-10.271604938271594]],[2,[0.0,0.0]],[4,[0.0,0.0]],[1,[0.0,0.0]],[8,[0.0,0.0]],[7,[0.0,0.0]]],"handle_end":[[7,[8.117474523314513,-0.7895812719984008]],[1,[1.3827160493826796,-12.641975308641976]],[5,[22.518518518518476,12.641975308641976]],[2,[-10.864197530864203,-35.5555555555556]],[4,[5.135802469135797,10.271604938271594]],[6,[0.0,0.0]],[3,[-12.049382716049422,68.54320987654324]],[8,[7.111111111110972,-82.76543209876547]]],"stroke":[[6,0],[1,0],[8,0],[4,0],[5,0],[7,0],[3,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":8}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[6124821161363551058,{"inputs":[{"Node":{"node_id":10420981328998103391,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[6749771744300551215,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5],"remove":[],"delta":[[5,[585.3333333333333,1025.7777777777778]],[4,[620.8888888888888,943.5555555555557]],[1,[589.3333333333333,1025.3333333333333]],[2,[660.4444444444443,878.2222222222222]],[3,[726.6666666666666,765.3333333333333]]]},"segments":{"add":[1,2,3,4,5],"remove":[],"start_point":[[1,1],[2,2],[3,3],[5,5],[4,4]],"end_point":[[3,4],[1,2],[4,5],[2,3],[5,1]],"handle_primary":[[2,[31.11111111111109,-50.66666666666663]],[4,[-29.333333333333258,59.11111111111097]],[5,[0.0,0.0]],[3,[0.0,0.0]],[1,[0.0,0.0]]],"handle_end":[[4,[0.0,0.0]],[3,[29.333333333333258,-59.1111111111112]],[5,[-0.4444444444443434,0.8888888888889142]],[1,[-31.863450886870623,51.89190573004646]],[2,[0.0,0.0]]],"stroke":[[2,0],[3,0],[1,0],[4,0],[5,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":5}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2440895173483452224,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[3,[33.18518518518515,636.148148148148]],[2,[30.814814814814767,578.0740740740739]],[1,[93.037037037037,526.8148148148147]]]},"segments":{"add":[1,2],"remove":[],"start_point":[[2,2],[1,1]],"end_point":[[2,3],[1,2]],"handle_primary":[[2,[-9.185185185185162,39.703703703703695]],[1,[0.0,0.0]]],"handle_end":[[1,[9.185185185185162,-39.703703703703695]],[2,[0.0,0.0]]],"stroke":[[2,0],[1,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11356586238302409958,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6],"remove":[],"delta":[[3,[732.148148148148,432.2962962962963]],[5,[811.8518518518518,273.18518518518516]],[4,[777.7777777777778,375.7037037037037]],[2,[783.1111111111111,348.74074074074065]],[6,[792.2962962962963,188.74074074074073]],[1,[811.5555555555555,250.96296296296296]]]},"segments":{"add":[1,2,3,4,5],"remove":[],"start_point":[[2,2],[4,4],[5,5],[3,3],[1,1]],"end_point":[[4,5],[3,4],[5,6],[1,2],[2,3]],"handle_primary":[[1,[0.0,0.0]],[2,[-14.6604291210798,34.80924611318039]],[4,[10.310300340717504,-19.181954122264813]],[5,[3.7834358363461433,-27.565032521950258]],[3,[0.0,0.0]]],"handle_end":[[1,[14.6604291210798,-34.809246113180336]],[2,[26.666666666666515,-35.555555555555486]],[4,[-4.148148148148152,30.22222222222223]],[5,[26.074074074074133,33.18518518518516]],[3,[-12.740740740740875,23.703703703703695]]],"stroke":[[3,0],[5,0],[2,0],[1,0],[4,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13231685386999438557,{"inputs":[{"Node":{"node_id":1659518581611333812,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[9371909264427723282,{"inputs":[{"Node":{"node_id":8595304668947966919,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.84705883,"green":0.5372549,"blue":0.38431373,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.84705883,"green":0.5372549,"blue":0.38431373,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[9782123335421401489,{"inputs":[{"Node":{"node_id":11656581020969095354,"output_index":0,"lambda":false}},{"Node":{"node_id":1019037285881657884,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2780251074492832077,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[3,[679.189837009989,239.99177480754585]],[4,[654.5349442975197,224.51689533908117]],[1,[620.0443231093315,208.38630063890184]],[2,[644.0435005900861,214.94345295604788]]]},"segments":{"add":[1,2,3,4],"remove":[],"start_point":[[2,2],[4,4],[3,3],[1,1]],"end_point":[[4,1],[2,3],[3,4],[1,2]],"handle_primary":[[3,[0.0,0.0]],[2,[17.048596024579638,8.262011919603992]],[1,[0.0,0.0]],[4,[-14.688021190407198,-10.884872846462486]]],"handle_end":[[4,[0.1311430463429133,0.13114304634288487]],[2,[-15.868308607493532,-9.835728475719122]],[3,[13.4932102981968,9.999432631699392]],[1,[-9.660678057982182,-4.68171321271447]]],"stroke":[[2,0],[3,0],[1,0],[4,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":4}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[17118107476414252025,{"inputs":[{"Node":{"node_id":6645255982686652881,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"DVec2":[74.2222222222222,480.0]},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[40.0,40.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.0,0.0]},"exposed":false}},{"Value":{"tagged_value":{"DVec2":[0.5,0.5]},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"glam::f64::dvec2::DVec2","alias":null}},"import_index":5}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::transform::TransformNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3627710206997006419,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[1,[152.49382716049382,262.71604938271605]],[2,[149.94787379972564,262.84773662551436]],[3,[154.2366898148148,257.4780574845679]]]},"segments":{"add":[1,2,3],"remove":[],"start_point":[[2,2],[3,3],[1,1]],"end_point":[[2,3],[3,1],[1,2]],"handle_primary":[[1,[0.0,0.0]],[3,[4.31137018907981,-2.5386217986682027]],[2,[-0.2633744855966995,-0.4389574759944139]]],"handle_end":[[3,[2.8421709430404014e-14,0.0]],[2,[-3.3775342902714556,1.988760370600971]],[1,[0.4650366425890411,0.7750610709815646]]],"stroke":[[3,0],[1,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":3}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[12838133055063962839,{"inputs":[{"Node":{"node_id":13644138583806412631,"output_index":0,"lambda":false}},{"Node":{"node_id":6973438081601736688,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7922156219537051964,{"inputs":[{"Node":{"node_id":13594670583065022897,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[15446793500614592278,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7,8],"remove":[],"delta":[[8,[697.5034293552812,77.4320987654321]],[2,[702.244170096022,76.11522633744856]],[3,[722.3484224965707,77.2565157750343]],[5,[718.2222222222222,97.09739368998628]],[1,[694.3429355281208,73.8326474622771]],[4,[725.5967078189301,90.3374485596708]],[6,[724.6310013717421,85.86008230452676]],[7,[718.3100137174213,77.2565157750343]]]},"segments":{"add":[1,2,3,4,5,6,7,8],"remove":[],"start_point":[[7,7],[2,2],[4,4],[3,3],[6,6],[8,8],[5,5],[1,1]],"end_point":[[3,4],[5,6],[2,3],[7,8],[6,7],[1,2],[4,5],[8,1]],"handle_primary":[[4,[-1.9392278971834005,5.143169640356035]],[8,[-3.5116598079559935,-1.6680384087791396]],[6,[-0.7023319615914261,-5.091906721536347]],[3,[3.456189131014753,3.3025807251918877]],[5,[0.0,0.0]],[1,[0.0,0.0]],[2,[5.267489711934218,-0.7023319615912129]],[7,[-6.236870142765838,-1.74052190030676]]],"handle_end":[[4,[0.0,0.0]],[5,[0.6823799889585871,4.947254919948108]],[6,[3.7750342935527215,1.0534979423868265]],[2,[-3.950617283950578,-3.775034293552821]],[1,[-5.267489711934218,0.7023319615912129]],[3,[2.0192043895747247,-5.355281207133089]],[8,[0.08779149519887142,0.08779149519891405]],[7,[3.5116598079559935,1.6680384087791396]]],"stroke":[[4,0],[1,0],[8,0],[3,0],[2,0],[5,0],[6,0],[7,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":8}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[9684857454501250999,{"inputs":[{"Node":{"node_id":8699675339613677057,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[13444661581815146533,{"inputs":[{"Node":{"node_id":16450742929146919960,"output_index":0,"lambda":false}},{"Node":{"node_id":10792166025753022402,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14993053984267866751,{"inputs":[{"Node":{"node_id":13907578809542898348,"output_index":0,"lambda":false}},{"Node":{"node_id":9863310024364795214,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16195626650123806176,{"inputs":[{"Node":{"node_id":14057307926677215422,"output_index":0,"lambda":false}},{"Node":{"node_id":1869448627329502330,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[18279507457571359732,{"inputs":[{"Node":{"node_id":8697043784435445845,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[3121275823460307102,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5],"remove":[],"delta":[[5,[595.5555555555555,791.1111111111111]],[1,[705.7777777777778,698.6666666666666]],[2,[612.0,780.0]],[4,[449.77777777777777,1025.7777777777778]],[3,[452.88888888888886,1025.3333333333333]]]},"segments":{"add":[1,2,3,4,5],"remove":[],"start_point":[[4,4],[3,3],[2,2],[1,1],[5,5]],"end_point":[[3,4],[2,3],[1,2],[5,1],[4,5]],"handle_primary":[[3,[0.0,0.0]],[4,[0.0,0.0]],[1,[0.0,0.0]],[2,[-35.111111111111086,34.66666666666663]],[5,[54.93054949731868,-52.22097082256312]]],"handle_end":[[1,[35.111111111111086,-34.66666666666663]],[5,[-1.1368683772161605e-13,-0.5925925925926094]],[3,[0.0,0.0]],[2,[59.111111111111086,-144.8888888888889]],[4,[-99.11111111111104,94.22222222222229]]],"stroke":[[3,0],[4,0],[1,0],[5,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":5}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13269760558336088742,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5],"remove":[],"delta":[[5,[756.4444444444443,438.22222222222223]],[2,[447.1111111111111,332.44444444444446]],[3,[595.1111111111111,439.55555555555554]],[4,[698.2222222222222,483.1111111111111]],[1,[265.3333333333333,312.0]]]},"segments":{"add":[1,2,3,4],"remove":[],"start_point":[[4,4],[2,2],[3,3],[1,1]],"end_point":[[1,2],[3,4],[4,5],[2,3]],"handle_primary":[[3,[20.8888888888888,20.444444444444457]],[2,[83.95959630801838,35.04735442215451]],[4,[22.46059594926794,-9.800987323316916]],[1,[0.0,0.0]]],"handle_end":[[2,[-20.8888888888888,-20.444444444444457]],[4,[-22.222222222222285,23.111111111111143]],[1,[-96.88888888888886,-40.44444444444446]],[3,[-48.888888888888914,21.33333333333331]]],"stroke":[[3,0],[2,0],[1,0],[4,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11590691579869262546,{"inputs":[{"Node":{"node_id":11553850607251055696,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[13481022631108980683,{"inputs":[{"Node":{"node_id":9182448229950585507,"output_index":0,"lambda":false}},{"Node":{"node_id":12224498203743157414,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[14797986717815207528,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5],"remove":[],"delta":[[3,[665.7777777777778,658.6666666666667]],[2,[425.0,650.0]],[1,[80.0,557.0]],[4,[826.6666666666665,552.4444444444443]],[5,[868.0,380.44444444444446]]]},"segments":{"add":[1,2,3,4],"remove":[],"start_point":[[2,2],[4,4],[3,3],[1,1]],"end_point":[[1,2],[2,3],[4,5],[3,4]],"handle_primary":[[3,[0.0,0.0]],[2,[105.59298295237464,48.735222901095995]],[1,[134.0,-75.0]],[4,[59.11111111111131,-70.66666666666652]]],"handle_end":[[2,[0.0,0.0]],[3,[-59.11111111111131,70.66666666666652]],[4,[0.0,0.0]],[1,[-104.0,-48.0]]],"stroke":[[1,0],[2,0],[4,0],[3,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[5861306074868809692,{"inputs":[{"Node":{"node_id":10190227675276560561,"output_index":0,"lambda":false}},{"Node":{"node_id":3636653585682494814,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13907578809542898348,{"inputs":[{"Node":{"node_id":12313564802550122052,"output_index":0,"lambda":false}},{"Node":{"node_id":15827578515555598997,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[581013017684525986,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2],"remove":[],"delta":[[2,[852.0,631.1111111111111]],[1,[803.5555555555554,878.6666666666665]]]},"segments":{"add":[1,2],"remove":[],"start_point":[[2,2],[1,1]],"end_point":[[2,1],[1,2]],"handle_primary":[[1,[0.0,0.0]],[2,[-41.77777777777783,81.77777777777771]]],"handle_end":[[2,[0.0,-0.4444444444443434]],[1,[-37.77777777777783,80.88888888888903]]],"stroke":[[1,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":2}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3670529450440935325,{"inputs":[{"Node":{"node_id":1384427686127078856,"output_index":0,"lambda":false}},{"Node":{"node_id":8543051864256131356,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[12030171742672119253,{"inputs":[{"Node":{"node_id":12801133692316734622,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[7450965328305122110,{"inputs":[{"Node":{"node_id":2659768650911099730,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.4},"exposed":false}},{"Value":{"tagged_value":{"F64":2.5},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[1806828617441445250,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[1,[395.3333333333333,758.0]],[4,[32.0,1025.3333333333333]],[2,[304.6666666666667,765.3333333333333]],[3,[147.33333333333334,814.0000000000001]]]},"segments":{"add":[1,2,3],"remove":[],"start_point":[[2,2],[1,1],[3,3]],"end_point":[[2,3],[3,4],[1,2]],"handle_primary":[[3,[-50.13723402627032,36.301698579412914]],[1,[0.0,0.0]],[2,[-32.666666666666686,0.6666666666667425]]],"handle_end":[[2,[50.137234026270335,-36.301698579412914]],[1,[32.666666666666686,-0.6666666666667425]],[3,[-0.6666666666666892,-122.66666666666686]]],"stroke":[[1,0],[2,0],[3,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13475705179546695973,{"inputs":[{"Node":{"node_id":11451028343967836482,"output_index":0,"lambda":false}},{"Node":{"node_id":501401493219507773,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2594533001540454577,{"inputs":[{"Node":{"node_id":15518174914032911052,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":8.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[9276497172451351253,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[3,[605.1760402377686,111.78783721993597]],[4,[605.9173906416706,103.71101966163694]],[2,[607.1269623532997,114.75323883554336]],[1,[606.8928516994359,102.3453741807651]]]},"segments":{"add":[1,2,3,4],"remove":[],"start_point":[[4,4],[1,1],[3,3],[2,2]],"end_point":[[4,1],[1,2],[2,3],[3,4]],"handle_primary":[[4,[0.27360881696279193,-0.7182231445274425]],[3,[-0.585276634659408,-2.419143423258646]],[2,[0.0,0.0]],[1,[0.0,0.0]]],"handle_end":[[3,[-0.6242950769699291,1.6387745770462772]],[2,[0.585276634659408,2.4191434232586317]],[1,[-1.3656454808717626,-5.306508154244753]],[4,[0.0,0.03901844231063478]]],"stroke":[[3,0],[4,0],[1,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":4}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7821977654068146599,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[1,[917.0,471.6]],[3,[825.9524005971,863.6469292802573]],[2,[826.5068586621596,856.9308484975209]]]},"segments":{"add":[1,2,3],"remove":[],"start_point":[[2,2],[1,1],[3,3]],"end_point":[[3,1],[2,3],[1,2]],"handle_primary":[[2,[0.0,0.0]],[1,[0.0,0.0]],[3,[0.0,0.0]]],"handle_end":[[1,[94.89314133784036,-231.73084849752092]],[3,[-0.39999999999997726,191.19999999999985]],[2,[0.0,0.0]]],"stroke":[[2,0],[3,0],[1,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":3}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15126865253122550765,{"inputs":[{"Node":{"node_id":13014628586360765651,"output_index":0,"lambda":false}},{"Node":{"node_id":4307303572241320716,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2682920349304670808,{"inputs":[{"Node":{"node_id":10928540355449103287,"output_index":0,"lambda":false}},{"Node":{"node_id":16324258033206362312,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13368990606109678244,{"inputs":[{"Node":{"node_id":421715625023770179,"output_index":0,"lambda":false}},{"Node":{"node_id":15961046538654083626,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16290933138334939444,{"inputs":[{"Node":{"node_id":17426609415699324395,"output_index":0,"lambda":false}},{"Node":{"node_id":14888395629683671889,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[12496143061817048445,{"inputs":[{"Node":{"node_id":7525593029671097583,"output_index":0,"lambda":false}},{"Node":{"node_id":7654665057468818389,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[12880230498984021417,{"inputs":[{"Node":{"node_id":15949658764632267703,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[14883504161508594099,{"inputs":[{"Node":{"node_id":13368990606109678244,"output_index":0,"lambda":false}},{"Node":{"node_id":11025165626998987360,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7262199696924786895,{"inputs":[{"Node":{"node_id":14029368390543839187,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[952330505278607301,{"inputs":[{"Node":{"node_id":15038739378867834454,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[5302437193964714993,{"inputs":[{"Node":{"node_id":1235106489581249820,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[10792166025753022402,{"inputs":[{"Node":{"node_id":2780251074492832077,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[16649851742084147477,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2],"remove":[],"delta":[[1,[870.6666666666665,383.55555555555554]],[2,[838.6666666666666,564.0]]]},"segments":{"add":[1],"remove":[],"start_point":[[1,1]],"end_point":[[1,2]],"handle_primary":[[1,[16.000000000000227,37.33333333333337]]],"handle_end":[[1,[48.44444444444446,-91.11111111111109]]],"stroke":[[1,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[1272070255512697108,{"inputs":[{"Node":{"node_id":14012648643507848353,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[17147975601187022720,{"inputs":[{"Node":{"node_id":18015048324114736039,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[15518174914032911052,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6],"remove":[],"delta":[[2,[814.2222222222223,498.66666666666663]],[1,[851.5555555555557,370.66666666666663]],[4,[429.7777777777778,551.5555555555555]],[5,[262.6666666666667,423.5555555555556]],[6,[129.77777777777777,406.2222222222222]],[3,[639.1111111111112,614.6666666666666]]]},"segments":{"add":[1,2,3,4,5],"remove":[],"start_point":[[2,2],[1,1],[4,4],[5,5],[3,3]],"end_point":[[2,3],[4,5],[1,2],[3,4],[5,6]],"handle_primary":[[4,[-74.22222222222217,-57.77777777777783]],[3,[-83.11111111111109,3.111111111111086]],[1,[0.0,0.0]],[2,[-43.55555555555554,54.66666666666663]],[5,[-58.2222222222222,-21.77777777777783]]],"handle_end":[[1,[43.55555555555554,-54.66666666666663]],[4,[66.87431172777582,25.01405553176352]],[3,[74.22222222222217,57.77777777777783]],[5,[57.333333333333314,-5.777777777777828]],[2,[83.11111111111109,-3.111111111111086]]],"stroke":[[1,0],[5,0],[2,0],[4,0],[3,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[17078740291337047697,{"inputs":[{"Node":{"node_id":3406722917122601552,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.84765625,"green":0.5384252,"blue":0.3874054,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.84765625,"green":0.5384252,"blue":0.3874054,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[10264089084180279094,{"inputs":[{"Node":{"node_id":5213978458941436169,"output_index":0,"lambda":false}},{"Node":{"node_id":4332145463108161926,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.0},"exposed":false}},{"Value":{"tagged_value":{"F64":60.0},"exposed":false}},{"Value":{"tagged_value":{"F64":-100.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[4859656512650360562,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[2,[249.3333333333334,898.0]],[3,[416.66666666666663,803.3333333333333]],[1,[163.33333333333343,1025.3333333333333]]]},"segments":{"add":[1,2],"remove":[],"start_point":[[1,1],[2,2]],"end_point":[[1,2],[2,3]],"handle_primary":[[2,[40.66666666666666,-40.666666666666515]],[1,[0.0,0.0]]],"handle_end":[[1,[-45.09988913511887,45.099889135118815]],[2,[-77.99999999999994,22.666666666666742]]],"stroke":[[2,0],[1,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[13594670583065022897,{"inputs":[{"Node":{"node_id":13302269488061286120,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4265165189651403984,{"inputs":[{"Value":{"tagged_value":{"GraphicGroup":{"instance":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":10264089084180279094,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[12428327489525325219,{"inputs":[{"Node":{"node_id":14209241002058525241,"output_index":0,"lambda":false}},{"Node":{"node_id":1984475088429379731,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[16767482995096345179,{"inputs":[{"Node":{"node_id":6532401937876437300,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[5278509881589546420,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[1,[899.1111111111111,600.0000000000001]],[3,[823.7037037037037,861.8666666666667]],[2,[824.4444444444445,850.2222222222223]]]},"segments":{"add":[1,2,3],"remove":[],"start_point":[[1,1],[2,2],[3,3]],"end_point":[[3,1],[1,2],[2,3]],"handle_primary":[[2,[0.0,0.0]],[3,[0.0,0.0]],[1,[0.0,0.0]]],"handle_end":[[1,[39.55555555555554,-105.8222222222222]],[2,[0.0,0.0]],[3,[-26.31111111111113,120.79999999999984]]],"stroke":[[1,0],[3,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":3}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7659717355245331967,{"inputs":[{"Node":{"node_id":18422317423856403288,"output_index":0,"lambda":false}},{"Node":{"node_id":4479074488343511985,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[8697043784435445845,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35],"remove":[],"delta":[[5,[616.4444444444443,170.22222222222223]],[1,[699.5555555555554,303.55555555555554]],[17,[183.50617283950615,231.70370370370372]],[7,[452.0,206.22222222222223]],[16,[172.44444444444446,239.40740740740745]],[29,[369.3827160493828,240.19753086419755]],[6,[553.7777777777777,195.11111111111111]],[27,[251.06172839506175,233.283950617284]],[9,[326.22222222222223,208.0]],[20,[217.87654320987656,231.90123456790127]],[34,[647.5061728395062,240.79012345679013]],[22,[195.95061728395063,253.8271604938272]],[3,[679.9012345679013,198.716049382716]],[8,[413.77777777777777,199.55555555555551]],[21,[216.8888888888889,238.22222222222223]],[13,[173.03703703703707,226.962962962963]],[23,[185.37661941777165,263.56957780826093]],[19,[205.23456790123456,227.55555555555557]],[15,[155.85185185185185,253.03703703703707]],[30,[425.4814814814815,246.71604938271605]],[2,[701.7777777777777,252.0]],[26,[227.55555555555557,246.51851851851853]],[10,[271.1111111111111,207.55555555555551]],[12,[199.11111111111111,214.51851851851853]],[31,[463.01234567901247,246.71604938271605]],[24,[188.90085842299663,268.4351595864769]],[28,[278.9135802469136,223.80246913580248]],[35,[680.888888888889,281.48148148148147]],[25,[201.87654320987656,262.12345679012344]],[18,[195.1604938271605,228.54320987654324]],[11,[208.44444444444443,212.0]],[32,[526.0246913580247,240.79012345679013]],[4,[647.5555555555554,171.55555555555557]],[14,[155.06172839506175,249.08641975308643]],[33,[602.2716049382716,229.5308641975309]]]},"segments":{"add":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35],"remove":[],"start_point":[[14,14],[30,30],[5,5],[1,1],[20,20],[22,22],[28,28],[15,15],[27,27],[21,21],[3,3],[24,24],[16,16],[9,9],[13,13],[34,34],[26,26],[10,10],[4,4],[12,12],[19,19],[11,11],[25,25],[33,33],[35,35],[7,7],[18,18],[8,8],[23,23],[32,32],[31,31],[17,17],[29,29],[6,6],[2,2]],"end_point":[[31,32],[7,8],[30,31],[19,20],[25,26],[24,25],[28,29],[33,34],[34,35],[22,23],[12,13],[5,6],[27,28],[2,3],[21,22],[13,14],[4,5],[26,27],[32,33],[23,24],[14,15],[18,19],[29,30],[16,17],[8,9],[10,11],[6,7],[35,1],[17,18],[9,10],[15,16],[11,12],[3,4],[1,2],[20,21]],"handle_primary":[[22,[-8.16460905349794,4.4115226337448235]],[14,[-1.61975308641982,1.935802469135723]],[35,[10.469135802469168,11.851851851851848]],[34,[10.074074074074131,11.85185185185182]],[10,[-12.888888888888856,1.7777777777778567]],[12,[-5.53086419753086,3.3580246913580254]],[3,[-17.576025737442137,-14.306067460708704]],[13,[-9.28395061728395,7.703703703703695]],[9,[-30.22222222222223,1.3333333333333712]],[17,[2.7654320987654444,-0.790123456790127]],[30,[11.061728395061778,0.7901234567900985]],[1,[0.0,0.0]],[11,[0.0,0.0]],[6,[-23.11111111111109,9.777777777777771]],[33,[24.098765432098844,-2.5679012345678984]],[5,[-12.0,3.555555555555543]],[7,[-8.444444444444457,-2.2222222222222285]],[8,[-25.33333333333331,1.7777777777778567]],[4,[-10.222222222222172,-3.5555555555555713]],[32,[23.90123456790127,-2.765432098765416]],[26,[8.493827160493822,-2.765432098765416]],[23,[-0.9364426154549506,2.4191434232586175]],[20,[2.3703703703704093,1.185185185185162]],[28,[14.81481481481478,1.9753086419753176]],[2,[-2.913580246913398,-22.66666666666669]],[15,[3.7530864197531177,-1.580246913580254]],[21,[-3.753086419753061,3.5555555555555713]],[31,[19.753086419753004,-4.543209876543159]],[24,[3.3430068414448044,-0.5735531240474074]],[18,[4.148148148148124,-1.3827160493827364]],[25,[4.938271604938279,-3.160493827160451]],[16,[5.530864197530889,-7.111111111111143]],[27,[6.518518518518505,-6.518518518518562]],[19,[4.74074074074079,0.9876543209876728]],[29,[29.4320987654321,3.358024691358054]]],"handle_end":[[5,[23.11111111111109,-9.777777777777745]],[34,[-10.469135802469168,-11.851851851851848]],[11,[5.530864197530917,-3.3580246913580254]],[18,[-4.740740740740705,-0.9876543209876728]],[33,[-10.074074074074131,-11.851851851851848]],[31,[-23.90123456790127,2.7654320987653875]],[13,[1.4782632300064904,-1.7667048358613044]],[3,[10.222222222222172,3.5555555555555713]],[25,[-8.493827160493822,2.765432098765416]],[35,[0.0,5.684341886080804e-14]],[27,[-14.81481481481478,-1.9753086419753176]],[28,[-29.4320987654321,-3.358024691357997]],[23,[-1.24660051630255,0.213876804468498]],[1,[2.822923929132685,21.961391245287817]],[26,[-6.518518518518505,6.518518518518505]],[29,[-11.061728395061778,-0.790123456790127]],[20,[3.753086419753089,-3.5555555555556]],[17,[-4.148148148148152,1.3827160493827648]],[8,[30.22222222222223,-1.3333333333333712]],[14,[-3.7530864197531177,1.580246913580254]],[12,[9.283950617283978,-7.703703703703695]],[4,[12.0,-3.555555555555543]],[2,[8.493827160493879,6.913580246913597]],[15,[-5.530864197530889,7.111111111111086]],[22,[0.752878950104872,-1.9449372877709263]],[6,[8.444444444444457,2.222222222222257]],[19,[-2.3703703703704093,-1.185185185185162]],[32,[-24.098765432098844,2.5679012345678984]],[24,[-4.938271604938279,3.160493827160451]],[9,[12.888888888888856,-1.777777777777743]],[10,[20.88888888888889,-1.4814814814814952]],[30,[-19.753086419753004,4.543209876543187]],[7,[25.33333333333331,-1.777777777777743]],[21,[9.952891875905069,-5.377772223271279]],[16,[-2.765432098765416,0.790123456790127]]],"stroke":[[21,0],[4,0],[19,0],[5,0],[17,0],[30,0],[26,0],[20,0],[1,0],[27,0],[18,0],[8,0],[16,0],[10,0],[31,0],[32,0],[2,0],[9,0],[14,0],[25,0],[15,0],[35,0],[24,0],[3,0],[33,0],[29,0],[22,0],[23,0],[11,0],[34,0],[6,0],[28,0],[12,0],[7,0],[13,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":35}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4236845268521674740,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3],"remove":[],"delta":[[3,[393.1851851851852,1025.4814814814813]],[2,[568.8888888888889,785.4814814814813]],[1,[397.6296296296296,1025.185185185185]]]},"segments":{"add":[1,2,3],"remove":[],"start_point":[[2,2],[1,1],[3,3]],"end_point":[[3,1],[1,2],[2,3]],"handle_primary":[[2,[0.0,0.0]],[3,[0.0,0.0]],[1,[0.0,0.0]]],"handle_end":[[3,null],[1,[-153.1851851851851,112.88888888888891]],[2,[33.777777777777885,-150.22222222222194]]],"stroke":[[2,0],[1,0],[3,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":3}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[1984475088429379731,{"inputs":[{"Node":{"node_id":1621196991038859321,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[9271343782272072828,{"inputs":[{"Node":{"node_id":4078100635676202528,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.8980392,"green":0.8,"blue":0.6117647,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[514796034658094296,{"inputs":[{"Node":{"node_id":13352561089252322209,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[8698602280607307123,{"inputs":[{"Node":{"node_id":14098374807212007572,"output_index":0,"lambda":false}},{"Node":{"node_id":14285767317419627814,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10770443343193024138,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5,6,7],"remove":[],"delta":[[5,[671.3086419753088,28.641975308641975]],[2,[621.0370370370372,23.01234567901235]],[4,[656.6913580246915,28.049382716049383]],[3,[634.172839506173,30.814814814814817]],[6,[656.4609053497943,30.375857338820303]],[1,[616.0987654320988,23.01234567901235]],[7,[634.1618655692731,33.7997256515775]]]},"segments":{"add":[1,2,3,4,5,6,7],"remove":[],"start_point":[[6,6],[1,1],[7,7],[3,3],[2,2],[4,4],[5,5]],"end_point":[[7,1],[5,6],[3,4],[1,2],[2,3],[6,7],[4,5]],"handle_primary":[[4,[4.345679012345727,-0.39506172839505993]],[1,[0.0,0.0]],[5,[0.0,0.0]],[2,[1.1851851851851052,1.5802469135802468]],[3,[6.024691358024711,0.4938271604938329]],[7,[-6.408779149519887,-0.8340192043895769]],[6,[-10.31550068587103,2.4142661179698237]]],"handle_end":[[4,[-0.39506172839503506,-0.5925925925925917]],[3,[-4.345679012345727,0.39506172839506704]],[1,[-1.1851851851851052,-1.5802469135802468]],[7,[4.455418381344316,5.4759945130315515]],[5,[10.31550068587103,-2.4142661179698237]],[6,[6.408779149519887,0.8340192043895769]],[2,[-6.024691358024711,-0.49382716049382935]]],"stroke":[[2,0],[4,0],[7,0],[3,0],[1,0],[6,0],[5,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":7}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[1019037285881657884,{"inputs":[{"Node":{"node_id":11481949351661484921,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[8410534738018320047,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2],"remove":[],"delta":[[1,[834.6666666666665,551.8024691358028]],[2,[762.5185185185184,667.5061728395063]]]},"segments":{"add":[1,2],"remove":[],"start_point":[[2,2],[1,1]],"end_point":[[1,2],[2,1]],"handle_primary":[[1,[0.0,0.0]],[2,[44.88888888888857,-64.49382716049388]]],"handle_end":[[2,null],[1,[47.85185185185162,-63.160493827160394]]],"stroke":[[2,0],[1,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":2}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2397243911096708995,{"inputs":[{"Node":{"node_id":10587073897090054035,"output_index":0,"lambda":false}},{"Node":{"node_id":7505360855062237520,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[541002100261582638,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[3,[609.7777777777777,559.5555555555555]],[1,[456.88888888888886,483.55555555555554]],[4,[648.4444444444443,543.5555555555555]],[2,[536.8888888888889,544.4444444444445]]]},"segments":{"add":[1,2,3],"remove":[],"start_point":[[1,1],[3,3],[2,2]],"end_point":[[1,2],[3,4],[2,3]],"handle_primary":[[3,[20.0,-7.555555555555543]],[2,[25.777777777777715,11.555555555555545]],[1,[0.0,0.0]]],"handle_end":[[3,[0.0,0.0]],[1,[-25.777777777777715,-11.555555555555545]],[2,[-20.0,7.555555555555543]]],"stroke":[[1,0],[2,0],[3,0]]},"regions":{"add":[],"remove":[],"segment_range":[],"fill":[]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[5009664118231399060,{"inputs":[{"Node":{"node_id":3226457726231232839,"output_index":0,"lambda":false}},{"Node":{"node_id":17207895962122263432,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[1378578509112405,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4,5],"remove":[],"delta":[[4,[594.6410608139003,75.57872275567746]],[5,[593.3924706599604,60.59564090839812]],[1,[602.6886145404666,50.91906721536352]],[2,[599.5281207133061,50.3923182441701]],[3,[590.4855967078191,66.80932784636488]]]},"segments":{"add":[1,2,3,4,5],"remove":[],"start_point":[[2,2],[4,4],[3,3],[5,5],[1,1]],"end_point":[[5,1],[4,5],[1,2],[2,3],[3,4]],"handle_primary":[[1,[0.0,0.0]],[5,[1.248590153939972,-3.9798811156835896]],[3,[1.9314128943758533,7.3257125438195345]],[2,[-1.843621399176982,0.5267489711934203]],[4,[0.0,0.0]]],"handle_end":[[1,[1.843621399176982,-0.5267489711934203]],[4,[-1.704168058538812,5.432035686592322]],[5,[-4.379820149367788,0.9754610577655498]],[3,[0.0,0.0]],[2,[-2.7532629181224593,-10.4429315732828]]],"stroke":[[5,0],[2,0],[1,0],[3,0],[4,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":5}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[501401493219507773,{"inputs":[{"Node":{"node_id":9425359632144678256,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.7529412,"green":0.15686275,"blue":0.13333334,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[1235106489581249820,{"inputs":[{"Node":{"node_id":3970516859959908758,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[2394762731964337494,{"inputs":[{"Value":{"tagged_value":{"ArtboardGroup":{"instance":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":4422453582814483232,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"IVec2":[0,0]},"exposed":false}},{"Value":{"tagged_value":{"IVec2":[1024,1024]},"exposed":false}},{"Value":{"tagged_value":{"Color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Bool":true},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graph_craft::document::value::TaggedValue","alias":null}},"import_index":1}},{"Value":{"tagged_value":{"String":"Artboard"},"exposed":false}},{"Network":{"import_type":{"Concrete":{"name":"graph_craft::document::value::TaggedValue","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"graph_craft::document::value::TaggedValue","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"graph_craft::document::value::TaggedValue","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"graph_craft::document::value::TaggedValue","alias":null}},"import_index":5}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToArtboardNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Network":{"import_type":{"Fn":[{"Concrete":{"name":"core::option::Option>","alias":null}},{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}}]},"import_index":0}},{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::AppendArtboardNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[4341772758799935306,{"inputs":[{"Node":{"node_id":1785173043494067496,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[3226457726231232839,{"inputs":[{"Node":{"node_id":4493274523708782092,"output_index":0,"lambda":false}},{"Node":{"node_id":7922156219537051964,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[6645255982686652881,{"inputs":[{"Value":{"tagged_value":{"VectorData":{"instance":[{"style":{"stroke":{"color":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0},"weight":0.0,"dash_lengths":[],"dash_offset":0.0,"cap":"Butt","join":"Miter","join_miter_limit":4.0,"align":"Center","transform":[1.0,0.0,0.0,1.0,0.0,0.0],"non_scaling":false,"paint_order":"StrokeAbove"},"fill":"None"},"colinear_manipulators":[],"point_domain":{"id":[],"position":[]},"segment_domain":{"id":[],"start_point":[],"end_point":[],"handles":[],"stroke":[]},"region_domain":{"id":[],"segment_range":[],"fill":[]},"upstream_graphic_group":null}],"transform":[[1.0,0.0,0.0,1.0,0.0,0.0]],"alpha_blending":[{"blend_mode":"Normal","opacity":1.0,"fill":1.0,"clip":false}],"source_node_id":[null]}},"exposed":true}},{"Value":{"tagged_value":{"VectorModification":{"points":{"add":[1,2,3,4],"remove":[],"delta":[[2,[1.0,0.5]],[3,[0.5,1.0]],[4,[0.0,0.5]],[1,[0.5,0.0]]]},"segments":{"add":[1,2,3,4],"remove":[],"start_point":[[2,2],[3,3],[1,1],[4,4]],"end_point":[[1,2],[2,3],[4,1],[3,4]],"handle_primary":[[3,[-0.275892388889507,0.0]],[1,[0.27589238888950707,0.0]],[2,[0.0,0.27589238888950707]],[4,[0.0,-0.275892388889507]]],"handle_end":[[3,[0.0,0.27589238888950707]],[1,[0.0,-0.275892388889507]],[2,[0.27589238888950707,0.0]],[4,[-0.275892388889507,0.0]]],"stroke":[[3,0],[4,0],[1,0],[2,0]]},"regions":{"add":[0],"remove":[],"segment_range":[[0,{"start":1,"end":4}]],"fill":[[0,0]]},"add_g1_continuous":[],"remove_g1_continuous":[]}},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::vector_data::modification::VectorModification","alias":null}},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::vector_data::modification::PathModifyNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[1162381870526064378,{"inputs":[{"Value":{"tagged_value":{"GraphicGroup":{"instance":[],"transform":[],"alpha_blending":[],"source_node_id":[]}},"exposed":true}},{"Node":{"node_id":9271343782272072828,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[7447657690776686262,{"inputs":[{"Node":{"node_id":3649809135741361946,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[9698363115186534174,{"inputs":[{"Node":{"node_id":1661691009086487874,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}],[5471152581000334146,{"inputs":[{"Node":{"node_id":12761901161949743155,"output_index":0,"lambda":false}},{"Node":{"node_id":952330505278607301,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15827578515555598997,{"inputs":[{"Node":{"node_id":15656854169166220905,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[14539627480594383748,{"inputs":[{"Node":{"node_id":581013017684525986,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"Fill":{"Solid":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}}},"exposed":false}},{"Value":{"tagged_value":{"OptionalColor":{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}},"exposed":false}},{"Value":{"tagged_value":{"Gradient":{"stops":[[0.0,{"red":0.0,"green":0.0,"blue":0.0,"alpha":1.0}],[1.0,{"red":1.0,"green":1.0,"blue":1.0,"alpha":1.0}]],"gradient_type":"Linear","start":[0.0,0.5],"end":[1.0,0.5],"transform":[1.0,0.0,0.0,1.0,0.0,0.0]}},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::FillNode"}},"visible":true,"skip_deduplication":false}],[2282726379014798660,{"inputs":[{"Node":{"node_id":454416440369338250,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[15637103575662751567,{"inputs":[{"Node":{"node_id":314278016428495768,"output_index":0,"lambda":false}},{"Node":{"node_id":4350324834849900949,"output_index":0,"lambda":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":1}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToElementNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}},{"Node":{"node_id":2,"output_index":0,"lambda":false}},{"Reflection":"DocumentNodePath"}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::LayerNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MonitorNode"}},"visible":true,"skip_deduplication":true}],[1,{"inputs":[{"Network":{"import_type":{"Generic":"T"},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::graphic_element::ToGroupNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[11417901103965737900,{"inputs":[{"Node":{"node_id":13269760558336088742,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"PointSpacingType":"Separation"},"exposed":false}},{"Value":{"tagged_value":{"F64":5.0},"exposed":false}},{"Value":{"tagged_value":{"F64":100.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"Bool":false},"exposed":false}}],"manual_composition":null,"implementation":{"Network":{"exports":[{"Node":{"node_id":4,"output_index":0,"lambda":false}}],"nodes":[[0,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SubpathSegmentLengthsNode"}},"visible":true,"skip_deduplication":false}],[4,{"inputs":[{"Node":{"node_id":3,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::BoundlessFootprintNode"}},"visible":true,"skip_deduplication":false}],[3,{"inputs":[{"Node":{"node_id":2,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::transform::FreezeRealTimeNode"}},"visible":true,"skip_deduplication":false}],[2,{"inputs":[{"Node":{"node_id":1,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::memo::MemoNode"}},"visible":true,"skip_deduplication":false}],[1,{"inputs":[{"Network":{"import_type":{"Concrete":{"name":"graphene_core::instances::Instances","alias":null}},"import_index":0}},{"Network":{"import_type":{"Concrete":{"name":"graphene_core::vector::misc::PointSpacingType","alias":null}},"import_index":1}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":2}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":3}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":4}},{"Network":{"import_type":{"Concrete":{"name":"f64","alias":null}},"import_index":5}},{"Network":{"import_type":{"Concrete":{"name":"bool","alias":null}},"import_index":6}},{"Node":{"node_id":0,"output_index":0,"lambda":false}}],"manual_composition":{"Generic":"T"},"implementation":{"ProtoNode":{"name":"graphene_core::vector::SamplePolylineNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]}},"visible":true,"skip_deduplication":false}],[10375238420217738812,{"inputs":[{"Node":{"node_id":2282726379014798660,"output_index":0,"lambda":false}},{"Node":{"node_id":17078740291337047697,"output_index":0,"lambda":false}},{"Value":{"tagged_value":{"F64":1.2},"exposed":false}},{"Value":{"tagged_value":{"F64":2.0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}},{"Value":{"tagged_value":{"F64":0.0},"exposed":false}},{"Value":{"tagged_value":{"U32":0},"exposed":false}}],"manual_composition":{"Concrete":{"name":"core::option::Option>","alias":null}},"implementation":{"ProtoNode":{"name":"graphene_core::vector::CopyToPointsNode"}},"visible":true,"skip_deduplication":false}]],"scope_injections":[]},"network_metadata":{"persistent_metadata":{"node_metadata":[[4572557574846980832,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"tooltip":"Artwork to be copied and placed at each point","input_name":"Instance"},"widget_override":null},{"input_data":{"range_max":2.0,"unit":"x","blank_assist":true,"min":0.0,"is_integer":false,"mode":"Range","tooltip":"Minimum range of randomized sizes given to each instance","input_name":"Random Scale Min","range_min":0.0},"widget_override":"number"},{"input_data":{"range_max":2.0,"min":0.0,"input_name":"Random Scale Max","is_integer":false,"range_min":0.0,"mode":"Range","tooltip":"Minimum range of randomized sizes given to each instance","unit":"x","blank_assist":true},"widget_override":"number"},{"input_data":{"range_min":-50.0,"blank_assist":true,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","is_integer":false,"mode":"Range","range_max":50.0,"input_name":"Random Scale Bias"},"widget_override":"number"},{"input_data":{"mode":"Increment","blank_assist":true,"min":0.0,"input_name":"Random Scale Seed","tooltip":"Seed to determine unique variations on all the randomized instance sizes","is_integer":true},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"min":0.0,"input_name":"Random Rotation","max":360.0,"mode":"Range","tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","unit":"°"},"widget_override":"number"},{"input_data":{"mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance angles","blank_assist":true,"input_name":"Random Rotation Seed","is_integer":true,"min":0.0},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[10190227675276560561,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[18015048324114736039,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[5020096817747898028,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[17147975601187022720,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[10270446074640675342,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{"unit":" px","y":"Y","x":"X"},"widget_override":"vec2"},{"input_data":{},"widget_override":"transform_rotation"},{"input_data":{"unit":"x","x":"W","y":"H"},"widget_override":"vec2"},{"input_data":{},"widget_override":"transform_skew"},{"input_data":{},"widget_override":"hidden"}],"output_names":["Data"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4248321400839848160,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Absolute":[-17,124]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[8697043784435445845,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10375238420217738812,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"tooltip":"Artwork to be copied and placed at each point","input_name":"Instance"},"widget_override":null},{"input_data":{"min":0.0,"tooltip":"Minimum range of randomized sizes given to each instance","mode":"Range","unit":"x","range_min":0.0,"is_integer":false,"range_max":2.0,"blank_assist":true,"input_name":"Random Scale Min"},"widget_override":"number"},{"input_data":{"tooltip":"Minimum range of randomized sizes given to each instance","unit":"x","mode":"Range","range_min":0.0,"min":0.0,"range_max":2.0,"blank_assist":true,"is_integer":false,"input_name":"Random Scale Max"},"widget_override":"number"},{"input_data":{"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","blank_assist":true,"range_min":-50.0,"mode":"Range","range_max":50.0,"input_name":"Random Scale Bias","is_integer":false},"widget_override":"number"},{"input_data":{"is_integer":true,"min":0.0,"tooltip":"Seed to determine unique variations on all the randomized instance sizes","mode":"Increment","blank_assist":true,"input_name":"Random Scale Seed"},"widget_override":"number"},{"input_data":{"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","input_name":"Random Rotation","unit":"°","mode":"Range","max":360.0,"blank_assist":true,"is_integer":false,"min":0.0},"widget_override":"number"},{"input_data":{"min":0.0,"tooltip":"Seed to determine unique variations on all the randomized instance angles","input_name":"Random Rotation Seed","blank_assist":true,"is_integer":true,"mode":"Increment"},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[12761901161949743155,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[8240895922641772563,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[542361600097372754,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15498700602024283966,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[8091904580702893317,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[16732130236852371275,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"mode":"Increment","blank_assist":true,"unit":" px","min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{"min":2.0,"mode":"Increment","is_integer":true,"blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"mode":"Increment","min":0.0,"unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":false,"unit":" px","blank_assist":true,"min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2126710823743005151,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[5009664118231399060,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[8934999452649011837,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Absolute":[-17,130]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[6749771744300551215,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[5213978458941436169,{"persistent_metadata":{"reference":"Scatter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"range_min":1.0,"blank_assist":true,"is_integer":false,"input_name":"Separation Disk Diameter","min":0.01,"range_max":100.0,"mode":"Range"},"widget_override":"number"},{"input_data":{"min":0.0,"is_integer":true,"mode":"Increment","blank_assist":true,"input_name":"Seed"},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Poisson-Disk Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[17324767436949538365,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4909350123806022131,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4859656512650360562,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[12428327489525325219,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11630078441485655672,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[17364155187784942740,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[2394762731964337494,{"persistent_metadata":{"reference":"Artboard","display_name":"","input_properties":[{"input_data":{"input_name":"Artboards"},"widget_override":null},{"input_data":{"input_name":"Contents"},"widget_override":"hidden"},{"input_data":{"y":"Y","unit":" px","input_name":"Location","x":"X"},"widget_override":"vec2"},{"input_data":{"x":"W","input_name":"Dimensions","unit":" px","y":"H"},"widget_override":"vec2"},{"input_data":{"input_name":"Background"},"widget_override":"artboard_background"},{"input_data":{"input_name":"Clip"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Absolute":[-3,1]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Artboard","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-10,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-2,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Append Artboards","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[6,-4]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11565160497886435388,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"mode":"Increment","blank_assist":true,"unit":" px","min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{"min":2.0,"mode":"Increment","is_integer":true,"blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"mode":"Increment","min":0.0,"unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":false,"unit":" px","blank_assist":true,"min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[1785173043494067496,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13368990606109678244,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[6580280438672662494,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13261814586176172586,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15982852655074258238,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[3535178979443201645,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4131094614457622424,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"mode":"Increment","blank_assist":true,"unit":" px","min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{"min":2.0,"mode":"Increment","is_integer":true,"blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"mode":"Increment","min":0.0,"unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":false,"unit":" px","blank_assist":true,"min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4332145463108161926,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-31,292]}}},"network_metadata":null}}],[14862049226133442027,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[1272070255512697108,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[18067513817508158001,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"mode":"Increment","blank_assist":true,"unit":" px","min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{"min":2.0,"mode":"Increment","is_integer":true,"blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"mode":"Increment","min":0.0,"unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":false,"unit":" px","blank_assist":true,"min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[501401493219507773,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[14029368390543839187,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[5174744389209053970,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14894569344576297448,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[2959546142916532439,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11025165626998987360,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"is_integer":false,"blank_assist":true,"input_name":"Random Scale Min","min":0.0,"range_max":2.0,"range_min":0.0,"tooltip":"Minimum range of randomized sizes given to each instance","unit":"x","mode":"Range"},"widget_override":"number"},{"input_data":{"mode":"Range","range_max":2.0,"blank_assist":true,"min":0.0,"is_integer":false,"range_min":0.0,"unit":"x","tooltip":"Minimum range of randomized sizes given to each instance","input_name":"Random Scale Max"},"widget_override":"number"},{"input_data":{"is_integer":false,"range_max":50.0,"range_min":-50.0,"blank_assist":true,"mode":"Range","input_name":"Random Scale Bias","tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)"},"widget_override":"number"},{"input_data":{"is_integer":true,"tooltip":"Seed to determine unique variations on all the randomized instance sizes","blank_assist":true,"input_name":"Random Scale Seed","min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{"unit":"°","input_name":"Random Rotation","mode":"Range","min":0.0,"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","blank_assist":true,"max":360.0,"is_integer":false},"widget_override":"number"},{"input_data":{"blank_assist":true,"mode":"Increment","min":0.0,"input_name":"Random Rotation Seed","tooltip":"Seed to determine unique variations on all the randomized instance angles","is_integer":true},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[17133591775058457007,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"range_max":2.0,"is_integer":false,"tooltip":"Minimum range of randomized sizes given to each instance","range_min":0.0,"unit":"x","mode":"Range","input_name":"Random Scale Min","blank_assist":true,"min":0.0},"widget_override":"number"},{"input_data":{"mode":"Range","tooltip":"Minimum range of randomized sizes given to each instance","input_name":"Random Scale Max","blank_assist":true,"min":0.0,"unit":"x","is_integer":false,"range_max":2.0,"range_min":0.0},"widget_override":"number"},{"input_data":{"input_name":"Random Scale Bias","is_integer":false,"range_max":50.0,"mode":"Range","range_min":-50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","blank_assist":true},"widget_override":"number"},{"input_data":{"input_name":"Random Scale Seed","is_integer":true,"min":0.0,"tooltip":"Seed to determine unique variations on all the randomized instance sizes","blank_assist":true,"mode":"Increment"},"widget_override":"number"},{"input_data":{"is_integer":false,"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","blank_assist":true,"min":0.0,"input_name":"Random Rotation","max":360.0,"mode":"Range","unit":"°"},"widget_override":"number"},{"input_data":{"min":0.0,"tooltip":"Seed to determine unique variations on all the randomized instance angles","blank_assist":true,"mode":"Increment","input_name":"Random Rotation Seed","is_integer":true},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[7659717355245331967,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[12219771677493189964,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[17078740291337047697,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-31,208]}}},"network_metadata":null}}],[12876462860151722087,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15798070933198867970,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11199691961479466803,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"mode":"Range","tooltip":"Minimum range of randomized sizes given to each instance","blank_assist":true,"input_name":"Random Scale Min","range_max":2.0,"unit":"x","min":0.0,"range_min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{"blank_assist":true,"input_name":"Random Scale Max","mode":"Range","min":0.0,"tooltip":"Minimum range of randomized sizes given to each instance","range_min":0.0,"unit":"x","is_integer":false,"range_max":2.0},"widget_override":"number"},{"input_data":{"mode":"Range","range_max":50.0,"input_name":"Random Scale Bias","blank_assist":true,"range_min":-50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","is_integer":false},"widget_override":"number"},{"input_data":{"blank_assist":true,"input_name":"Random Scale Seed","min":0.0,"is_integer":true,"mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance sizes"},"widget_override":"number"},{"input_data":{"unit":"°","input_name":"Random Rotation","is_integer":false,"max":360.0,"blank_assist":true,"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","min":0.0,"mode":"Range"},"widget_override":"number"},{"input_data":{"blank_assist":true,"is_integer":true,"min":0.0,"input_name":"Random Rotation Seed","mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance angles"},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[10792166025753022402,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[15961046538654083626,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"blank_assist":true,"mode":"Range","tooltip":"Minimum range of randomized sizes given to each instance","is_integer":false,"range_min":0.0,"input_name":"Random Scale Min","range_max":2.0,"unit":"x","min":0.0},"widget_override":"number"},{"input_data":{"mode":"Range","range_min":0.0,"is_integer":false,"range_max":2.0,"tooltip":"Minimum range of randomized sizes given to each instance","blank_assist":true,"min":0.0,"input_name":"Random Scale Max","unit":"x"},"widget_override":"number"},{"input_data":{"range_max":50.0,"is_integer":false,"input_name":"Random Scale Bias","tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","blank_assist":true,"range_min":-50.0,"mode":"Range"},"widget_override":"number"},{"input_data":{"mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance sizes","blank_assist":true,"input_name":"Random Scale Seed","is_integer":true,"min":0.0},"widget_override":"number"},{"input_data":{"mode":"Range","max":360.0,"unit":"°","tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","input_name":"Random Rotation","min":0.0,"blank_assist":true,"is_integer":false},"widget_override":"number"},{"input_data":{"blank_assist":true,"input_name":"Random Rotation Seed","tooltip":"Seed to determine unique variations on all the randomized instance angles","is_integer":true,"min":0.0,"mode":"Increment"},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[12313564802550122052,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11451028343967836482,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13975451746581400000,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4422453582814483232,{"persistent_metadata":{"reference":"Merge","display_name":"Hair and Face","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Absolute":[-7,4]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16805628435335819723,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[14098374807212007572,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15815816861435910950,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[17378885078543074499,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4784708315242877950,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11656581020969095354,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4222034829755771252,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14982414026754548178,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"range_max":2.0,"blank_assist":true,"range_min":0.0,"tooltip":"Minimum range of randomized sizes given to each instance","unit":"x","input_name":"Random Scale Min","min":0.0,"mode":"Range","is_integer":false},"widget_override":"number"},{"input_data":{"min":0.0,"is_integer":false,"tooltip":"Minimum range of randomized sizes given to each instance","mode":"Range","blank_assist":true,"range_min":0.0,"input_name":"Random Scale Max","unit":"x","range_max":2.0},"widget_override":"number"},{"input_data":{"is_integer":false,"input_name":"Random Scale Bias","range_max":50.0,"blank_assist":true,"range_min":-50.0,"mode":"Range","tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)"},"widget_override":"number"},{"input_data":{"is_integer":true,"blank_assist":true,"input_name":"Random Scale Seed","min":0.0,"mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance sizes"},"widget_override":"number"},{"input_data":{"unit":"°","is_integer":false,"blank_assist":true,"min":0.0,"mode":"Range","input_name":"Random Rotation","max":360.0,"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise"},"widget_override":"number"},{"input_data":{"blank_assist":true,"tooltip":"Seed to determine unique variations on all the randomized instance angles","min":0.0,"mode":"Increment","input_name":"Random Rotation Seed","is_integer":true},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[2660652185019504730,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"mode":"Increment","blank_assist":true,"unit":" px","min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{"min":2.0,"mode":"Increment","is_integer":true,"blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"mode":"Increment","min":0.0,"unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":false,"unit":" px","blank_assist":true,"min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16756940771483104467,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[5555007473125503522,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4078100635676202528,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[5140869461760168364,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[12473080738469616517,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[13475705179546695973,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2682920349304670808,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[17971411534648521628,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[5861306074868809692,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[9740500978584792725,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[9698363115186534174,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"is_integer":false,"range_max":2.0,"unit":"x","range_min":0.0,"tooltip":"Minimum range of randomized sizes given to each instance","min":0.0,"blank_assist":true,"input_name":"Random Scale Min","mode":"Range"},"widget_override":"number"},{"input_data":{"input_name":"Random Scale Max","range_min":0.0,"blank_assist":true,"mode":"Range","is_integer":false,"min":0.0,"range_max":2.0,"tooltip":"Minimum range of randomized sizes given to each instance","unit":"x"},"widget_override":"number"},{"input_data":{"input_name":"Random Scale Bias","blank_assist":true,"is_integer":false,"range_min":-50.0,"range_max":50.0,"mode":"Range","tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)"},"widget_override":"number"},{"input_data":{"tooltip":"Seed to determine unique variations on all the randomized instance sizes","blank_assist":true,"input_name":"Random Scale Seed","min":0.0,"mode":"Increment","is_integer":true},"widget_override":"number"},{"input_data":{"unit":"°","min":0.0,"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","mode":"Range","input_name":"Random Rotation","is_integer":false,"max":360.0,"blank_assist":true},"widget_override":"number"},{"input_data":{"input_name":"Random Rotation Seed","mode":"Increment","is_integer":true,"min":0.0,"tooltip":"Seed to determine unique variations on all the randomized instance angles","blank_assist":true},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[5455777299776842371,{"persistent_metadata":{"reference":"Merge","display_name":"Beaded Skirt","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":78}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4236845268521674740,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4341772758799935306,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"mode":"Increment","blank_assist":true,"unit":" px","min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{"min":2.0,"mode":"Increment","is_integer":true,"blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"mode":"Increment","min":0.0,"unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":false,"unit":" px","blank_assist":true,"min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[421715625023770179,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14887821801874852671,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15286091228862934481,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2397243911096708995,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[17967471489196302183,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[581013017684525986,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[7450965328305122110,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"mode":"Range","range_max":2.0,"tooltip":"Minimum range of randomized sizes given to each instance","is_integer":false,"blank_assist":true,"range_min":0.0,"min":0.0,"input_name":"Random Scale Min","unit":"x"},"widget_override":"number"},{"input_data":{"input_name":"Random Scale Max","range_min":0.0,"tooltip":"Minimum range of randomized sizes given to each instance","mode":"Range","unit":"x","blank_assist":true,"min":0.0,"is_integer":false,"range_max":2.0},"widget_override":"number"},{"input_data":{"range_max":50.0,"blank_assist":true,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","mode":"Range","is_integer":false,"range_min":-50.0,"input_name":"Random Scale Bias"},"widget_override":"number"},{"input_data":{"is_integer":true,"input_name":"Random Scale Seed","mode":"Increment","min":0.0,"tooltip":"Seed to determine unique variations on all the randomized instance sizes","blank_assist":true},"widget_override":"number"},{"input_data":{"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","min":0.0,"unit":"°","max":360.0,"mode":"Range","input_name":"Random Rotation","is_integer":false,"blank_assist":true},"widget_override":"number"},{"input_data":{"mode":"Increment","input_name":"Random Rotation Seed","blank_assist":true,"is_integer":true,"min":0.0,"tooltip":"Seed to determine unique variations on all the randomized instance angles"},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[16051539163551573193,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11677503666435782605,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[10133176481349663495,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[5326536612985524219,{"persistent_metadata":{"reference":"Scatter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"range_max":100.0,"input_name":"Separation Disk Diameter","blank_assist":true,"is_integer":false,"min":0.01,"mode":"Range","range_min":1.0},"widget_override":"number"},{"input_data":{"mode":"Increment","min":0.0,"blank_assist":true,"input_name":"Seed","is_integer":true},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Poisson-Disk Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14888395629683671889,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"mode":"Range","range_min":0.0,"input_name":"Random Scale Min","range_max":2.0,"blank_assist":true,"tooltip":"Minimum range of randomized sizes given to each instance","unit":"x","is_integer":false,"min":0.0},"widget_override":"number"},{"input_data":{"input_name":"Random Scale Max","tooltip":"Minimum range of randomized sizes given to each instance","is_integer":false,"unit":"x","range_min":0.0,"blank_assist":true,"mode":"Range","range_max":2.0,"min":0.0},"widget_override":"number"},{"input_data":{"range_max":50.0,"input_name":"Random Scale Bias","range_min":-50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","is_integer":false,"blank_assist":true,"mode":"Range"},"widget_override":"number"},{"input_data":{"tooltip":"Seed to determine unique variations on all the randomized instance sizes","is_integer":true,"input_name":"Random Scale Seed","min":0.0,"blank_assist":true,"mode":"Increment"},"widget_override":"number"},{"input_data":{"unit":"°","tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","blank_assist":true,"min":0.0,"mode":"Range","is_integer":false,"input_name":"Random Rotation","max":360.0},"widget_override":"number"},{"input_data":{"mode":"Increment","blank_assist":true,"tooltip":"Seed to determine unique variations on all the randomized instance angles","input_name":"Random Rotation Seed","is_integer":true,"min":0.0},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[1889157037801767612,{"persistent_metadata":{"reference":"Scatter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"mode":"Range","blank_assist":true,"input_name":"Separation Disk Diameter","is_integer":false,"range_max":100.0,"range_min":1.0,"min":0.01},"widget_override":"number"},{"input_data":{"blank_assist":true,"input_name":"Seed","is_integer":true,"min":0.0,"mode":"Increment"},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Poisson-Disk Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[7654665057468818389,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[8699675339613677057,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"unit":" px","input_name":"Translation","x":"X","y":"Y"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"unit":"x","y":"H","x":"W","input_name":"Scale"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"hidden"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[7141088190930752823,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"mode":"Increment","blank_assist":true,"unit":" px","min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{"min":2.0,"mode":"Increment","is_integer":true,"blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"mode":"Increment","min":0.0,"unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":false,"unit":" px","blank_assist":true,"min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13907578809542898348,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14285767317419627814,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[8595304668947966919,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[9374264173303233490,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"mode":"Increment","blank_assist":true,"unit":" px","min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{"min":2.0,"mode":"Increment","is_integer":true,"blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"mode":"Increment","min":0.0,"unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":false,"unit":" px","blank_assist":true,"min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11194653561109699287,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11268046366284173800,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[3170924135668664007,{"persistent_metadata":{"reference":"Merge","display_name":"Pointing Arm","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":6}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15446793500614592278,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[9778375740427894463,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[9863310024364795214,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[18190631752493248867,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[9782123335421401489,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[17529660518597229229,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"mode":"Range","is_integer":false,"min":0.0,"range_max":2.0,"blank_assist":true,"range_min":0.0,"tooltip":"Minimum range of randomized sizes given to each instance","input_name":"Random Scale Min","unit":"x"},"widget_override":"number"},{"input_data":{"range_max":2.0,"blank_assist":true,"mode":"Range","is_integer":false,"unit":"x","input_name":"Random Scale Max","range_min":0.0,"tooltip":"Minimum range of randomized sizes given to each instance","min":0.0},"widget_override":"number"},{"input_data":{"range_max":50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","blank_assist":true,"mode":"Range","range_min":-50.0,"input_name":"Random Scale Bias","is_integer":false},"widget_override":"number"},{"input_data":{"is_integer":true,"min":0.0,"blank_assist":true,"input_name":"Random Scale Seed","mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance sizes"},"widget_override":"number"},{"input_data":{"max":360.0,"input_name":"Random Rotation","tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","blank_assist":true,"is_integer":false,"mode":"Range","unit":"°","min":0.0},"widget_override":"number"},{"input_data":{"blank_assist":true,"tooltip":"Seed to determine unique variations on all the randomized instance angles","min":0.0,"mode":"Increment","input_name":"Random Rotation Seed","is_integer":true},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[3992858139802231032,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11590691579869262546,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[4577174813962563383,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11632506522064533635,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16767482995096345179,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[5002654561220917457,{"persistent_metadata":{"reference":"Scatter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"min":0.01,"input_name":"Separation Disk Diameter","mode":"Range","is_integer":false,"range_min":1.0,"blank_assist":true,"range_max":100.0},"widget_override":"number"},{"input_data":{"min":0.0,"blank_assist":true,"mode":"Increment","is_integer":true,"input_name":"Seed"},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Poisson-Disk Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14883504161508594099,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Absolute":[-17,295]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10421722418968896452,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16450742929146919960,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10928540355449103287,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4372998635946271235,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[12801133692316734622,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"mode":"Increment","blank_assist":true,"unit":" px","min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{"min":2.0,"mode":"Increment","is_integer":true,"blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"mode":"Increment","min":0.0,"unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":false,"unit":" px","blank_assist":true,"min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[5040278174920511484,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[9271343782272072828,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[3636653585682494814,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"range_min":0.0,"unit":"x","range_max":2.0,"input_name":"Random Scale Min","is_integer":false,"mode":"Range","blank_assist":true,"min":0.0,"tooltip":"Minimum range of randomized sizes given to each instance"},"widget_override":"number"},{"input_data":{"tooltip":"Minimum range of randomized sizes given to each instance","blank_assist":true,"input_name":"Random Scale Max","min":0.0,"unit":"x","mode":"Range","range_min":0.0,"is_integer":false,"range_max":2.0},"widget_override":"number"},{"input_data":{"mode":"Range","range_min":-50.0,"input_name":"Random Scale Bias","range_max":50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","blank_assist":true,"is_integer":false},"widget_override":"number"},{"input_data":{"mode":"Increment","input_name":"Random Scale Seed","is_integer":true,"blank_assist":true,"tooltip":"Seed to determine unique variations on all the randomized instance sizes","min":0.0},"widget_override":"number"},{"input_data":{"input_name":"Random Rotation","mode":"Range","blank_assist":true,"min":0.0,"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","unit":"°","max":360.0,"is_integer":false},"widget_override":"number"},{"input_data":{"is_integer":true,"tooltip":"Seed to determine unique variations on all the randomized instance angles","mode":"Increment","input_name":"Random Rotation Seed","blank_assist":true,"min":0.0},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[7922156219537051964,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"is_integer":false,"min":0.0,"input_name":"Random Scale Min","mode":"Range","range_max":2.0,"blank_assist":true,"range_min":0.0,"tooltip":"Minimum range of randomized sizes given to each instance","unit":"x"},"widget_override":"number"},{"input_data":{"min":0.0,"mode":"Range","range_max":2.0,"range_min":0.0,"input_name":"Random Scale Max","unit":"x","is_integer":false,"tooltip":"Minimum range of randomized sizes given to each instance","blank_assist":true},"widget_override":"number"},{"input_data":{"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","mode":"Range","is_integer":false,"input_name":"Random Scale Bias","range_min":-50.0,"blank_assist":true,"range_max":50.0},"widget_override":"number"},{"input_data":{"is_integer":true,"mode":"Increment","input_name":"Random Scale Seed","blank_assist":true,"min":0.0,"tooltip":"Seed to determine unique variations on all the randomized instance sizes"},"widget_override":"number"},{"input_data":{"max":360.0,"mode":"Range","min":0.0,"is_integer":false,"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","input_name":"Random Rotation","unit":"°","blank_assist":true},"widget_override":"number"},{"input_data":{"tooltip":"Seed to determine unique variations on all the randomized instance angles","mode":"Increment","blank_assist":true,"input_name":"Random Rotation Seed","is_integer":true,"min":0.0},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[431994205232245356,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Absolute":[-17,7]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[12030171742672119253,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"is_integer":false,"input_name":"Random Scale Min","range_max":2.0,"unit":"x","range_min":0.0,"tooltip":"Minimum range of randomized sizes given to each instance","min":0.0,"blank_assist":true,"mode":"Range"},"widget_override":"number"},{"input_data":{"input_name":"Random Scale Max","tooltip":"Minimum range of randomized sizes given to each instance","mode":"Range","range_min":0.0,"is_integer":false,"range_max":2.0,"unit":"x","blank_assist":true,"min":0.0},"widget_override":"number"},{"input_data":{"blank_assist":true,"mode":"Range","range_max":50.0,"input_name":"Random Scale Bias","tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","is_integer":false,"range_min":-50.0},"widget_override":"number"},{"input_data":{"blank_assist":true,"min":0.0,"is_integer":true,"mode":"Increment","input_name":"Random Scale Seed","tooltip":"Seed to determine unique variations on all the randomized instance sizes"},"widget_override":"number"},{"input_data":{"mode":"Range","unit":"°","input_name":"Random Rotation","is_integer":false,"blank_assist":true,"max":360.0,"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","min":0.0},"widget_override":"number"},{"input_data":{"blank_assist":true,"input_name":"Random Rotation Seed","min":0.0,"tooltip":"Seed to determine unique variations on all the randomized instance angles","is_integer":true,"mode":"Increment"},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[17699121037850769131,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[8698602280607307123,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[3971837674569123876,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"blank_assist":true,"mode":"Range","is_integer":false,"min":0.0,"input_name":"Random Scale Min","unit":"x","tooltip":"Minimum range of randomized sizes given to each instance","range_min":0.0,"range_max":2.0},"widget_override":"number"},{"input_data":{"tooltip":"Minimum range of randomized sizes given to each instance","blank_assist":true,"range_max":2.0,"mode":"Range","input_name":"Random Scale Max","is_integer":false,"min":0.0,"range_min":0.0,"unit":"x"},"widget_override":"number"},{"input_data":{"range_min":-50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","blank_assist":true,"input_name":"Random Scale Bias","is_integer":false,"range_max":50.0,"mode":"Range"},"widget_override":"number"},{"input_data":{"input_name":"Random Scale Seed","is_integer":true,"blank_assist":true,"tooltip":"Seed to determine unique variations on all the randomized instance sizes","min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","max":360.0,"min":0.0,"blank_assist":true,"mode":"Range","input_name":"Random Rotation","is_integer":false,"unit":"°"},"widget_override":"number"},{"input_data":{"is_integer":true,"mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance angles","min":0.0,"input_name":"Random Rotation Seed","blank_assist":true},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[172538270105470471,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[1378578509112405,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10424806499648491677,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[6416452251137958677,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"tooltip":"Artwork to be copied and placed at each point","input_name":"Instance"},"widget_override":null},{"input_data":{"input_name":"Random Scale Min","min":0.0,"is_integer":false,"mode":"Range","range_max":2.0,"tooltip":"Minimum range of randomized sizes given to each instance","blank_assist":true,"unit":"x","range_min":0.0},"widget_override":"number"},{"input_data":{"mode":"Range","is_integer":false,"min":0.0,"input_name":"Random Scale Max","range_max":2.0,"range_min":0.0,"unit":"x","tooltip":"Minimum range of randomized sizes given to each instance","blank_assist":true},"widget_override":"number"},{"input_data":{"mode":"Range","is_integer":false,"range_max":50.0,"input_name":"Random Scale Bias","blank_assist":true,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","range_min":-50.0},"widget_override":"number"},{"input_data":{"min":0.0,"tooltip":"Seed to determine unique variations on all the randomized instance sizes","blank_assist":true,"input_name":"Random Scale Seed","is_integer":true,"mode":"Increment"},"widget_override":"number"},{"input_data":{"unit":"°","is_integer":false,"input_name":"Random Rotation","max":360.0,"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","blank_assist":true,"min":0.0,"mode":"Range"},"widget_override":"number"},{"input_data":{"blank_assist":true,"tooltip":"Seed to determine unique variations on all the randomized instance angles","min":0.0,"input_name":"Random Rotation Seed","mode":"Increment","is_integer":true},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[2659768650911099730,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"mode":"Increment","blank_assist":true,"unit":" px","min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{"min":2.0,"mode":"Increment","is_integer":true,"blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"mode":"Increment","min":0.0,"unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":false,"unit":" px","blank_assist":true,"min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[6124821161363551058,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"mode":"Increment","blank_assist":true,"unit":" px","min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{"min":2.0,"mode":"Increment","is_integer":true,"blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"mode":"Increment","min":0.0,"unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":false,"unit":" px","blank_assist":true,"min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11058365317860779469,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2175432926627256613,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Absolute":[-17,328]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[6666260895482068061,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13481022631108980683,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[6988349135757634271,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[6282972142629473139,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[1204243038352113866,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[7821977654068146599,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13302269488061286120,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[7893851488963635918,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[907841922684377912,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[12838133055063962839,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15492651270767932214,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2698266912167150713,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[15518174914032911052,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16446146761452576438,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Translation","unit":" px","y":"Y","x":"X"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"y":"H","x":"W","input_name":"Scale","unit":"x"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"hidden"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14817659161913199655,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11464423670065789907,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"range_min":0.0,"mode":"Range","input_name":"Random Scale Min","tooltip":"Minimum range of randomized sizes given to each instance","unit":"x","blank_assist":true,"is_integer":false,"range_max":2.0,"min":0.0},"widget_override":"number"},{"input_data":{"unit":"x","blank_assist":true,"tooltip":"Minimum range of randomized sizes given to each instance","is_integer":false,"min":0.0,"mode":"Range","range_max":2.0,"range_min":0.0,"input_name":"Random Scale Max"},"widget_override":"number"},{"input_data":{"blank_assist":true,"is_integer":false,"range_max":50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","mode":"Range","range_min":-50.0,"input_name":"Random Scale Bias"},"widget_override":"number"},{"input_data":{"tooltip":"Seed to determine unique variations on all the randomized instance sizes","blank_assist":true,"input_name":"Random Scale Seed","min":0.0,"is_integer":true,"mode":"Increment"},"widget_override":"number"},{"input_data":{"min":0.0,"mode":"Range","max":360.0,"blank_assist":true,"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","unit":"°","is_integer":false,"input_name":"Random Rotation"},"widget_override":"number"},{"input_data":{"tooltip":"Seed to determine unique variations on all the randomized instance angles","min":0.0,"blank_assist":true,"is_integer":true,"input_name":"Random Rotation Seed","mode":"Increment"},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[12049041947382267086,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"x":"X","y":"Y","unit":" px","input_name":"Translation"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"x":"W","input_name":"Scale","unit":"x","y":"H"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"hidden"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10336592647221792772,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[9684857454501250999,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[9529195152569434392,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[14539627480594383748,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[3955326429435439190,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"tooltip":"Artwork to be copied and placed at each point","input_name":"Instance"},"widget_override":null},{"input_data":{"unit":"x","mode":"Range","range_max":2.0,"range_min":0.0,"is_integer":false,"blank_assist":true,"input_name":"Random Scale Min","tooltip":"Minimum range of randomized sizes given to each instance","min":0.0},"widget_override":"number"},{"input_data":{"tooltip":"Minimum range of randomized sizes given to each instance","range_max":2.0,"blank_assist":true,"min":0.0,"range_min":0.0,"unit":"x","input_name":"Random Scale Max","is_integer":false,"mode":"Range"},"widget_override":"number"},{"input_data":{"blank_assist":true,"mode":"Range","input_name":"Random Scale Bias","is_integer":false,"range_min":-50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","range_max":50.0},"widget_override":"number"},{"input_data":{"tooltip":"Seed to determine unique variations on all the randomized instance sizes","is_integer":true,"mode":"Increment","blank_assist":true,"input_name":"Random Scale Seed","min":0.0},"widget_override":"number"},{"input_data":{"blank_assist":true,"min":0.0,"mode":"Range","unit":"°","max":360.0,"is_integer":false,"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","input_name":"Random Rotation"},"widget_override":"number"},{"input_data":{"input_name":"Random Rotation Seed","blank_assist":true,"mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance angles","is_integer":true,"min":0.0},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[2087303479944421366,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11804065810513502701,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13014628586360765651,{"persistent_metadata":{"reference":"Merge","display_name":"Dotted Aura","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":6}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15466714490303763249,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[541002100261582638,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[3165571685352930240,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2422139482859833437,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10514847656270897393,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[9182448229950585507,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16649851742084147477,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13644138583806412631,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4350324834849900949,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[13594670583065022897,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"mode":"Increment","blank_assist":true,"unit":" px","min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{"min":2.0,"mode":"Increment","is_integer":true,"blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"mode":"Increment","min":0.0,"unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":false,"unit":" px","blank_assist":true,"min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15578929303912288394,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[2594533001540454577,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"mode":"Increment","blank_assist":true,"unit":" px","min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{"min":2.0,"mode":"Increment","is_integer":true,"blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"mode":"Increment","min":0.0,"unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":false,"unit":" px","blank_assist":true,"min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16434255153991868080,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"tooltip":"Artwork to be copied and placed at each point","input_name":"Instance"},"widget_override":null},{"input_data":{"range_min":0.0,"tooltip":"Minimum range of randomized sizes given to each instance","is_integer":false,"input_name":"Random Scale Min","unit":"x","mode":"Range","blank_assist":true,"min":0.0,"range_max":2.0},"widget_override":"number"},{"input_data":{"is_integer":false,"mode":"Range","range_max":2.0,"min":0.0,"range_min":0.0,"unit":"x","input_name":"Random Scale Max","tooltip":"Minimum range of randomized sizes given to each instance","blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"input_name":"Random Scale Bias","mode":"Range","range_min":-50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","range_max":50.0},"widget_override":"number"},{"input_data":{"tooltip":"Seed to determine unique variations on all the randomized instance sizes","input_name":"Random Scale Seed","min":0.0,"blank_assist":true,"is_integer":true,"mode":"Increment"},"widget_override":"number"},{"input_data":{"is_integer":false,"min":0.0,"max":360.0,"unit":"°","blank_assist":true,"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","mode":"Range","input_name":"Random Rotation"},"widget_override":"number"},{"input_data":{"mode":"Increment","blank_assist":true,"input_name":"Random Rotation Seed","min":0.0,"tooltip":"Seed to determine unique variations on all the randomized instance angles","is_integer":true},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[3121275823460307102,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[5185036609290210853,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13035777574951374461,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4832236468224231783,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[17426609415699324395,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10432831427187785843,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[11616089678400336955,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"min":0.0,"unit":"x","blank_assist":true,"mode":"Range","tooltip":"Minimum range of randomized sizes given to each instance","input_name":"Random Scale Min","is_integer":false,"range_max":2.0,"range_min":0.0},"widget_override":"number"},{"input_data":{"unit":"x","tooltip":"Minimum range of randomized sizes given to each instance","range_min":0.0,"blank_assist":true,"mode":"Range","min":0.0,"is_integer":false,"input_name":"Random Scale Max","range_max":2.0},"widget_override":"number"},{"input_data":{"range_max":50.0,"blank_assist":true,"is_integer":false,"input_name":"Random Scale Bias","mode":"Range","range_min":-50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)"},"widget_override":"number"},{"input_data":{"mode":"Increment","min":0.0,"blank_assist":true,"is_integer":true,"input_name":"Random Scale Seed","tooltip":"Seed to determine unique variations on all the randomized instance sizes"},"widget_override":"number"},{"input_data":{"input_name":"Random Rotation","min":0.0,"mode":"Range","tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","unit":"°","is_integer":false,"max":360.0,"blank_assist":true},"widget_override":"number"},{"input_data":{"min":0.0,"blank_assist":true,"tooltip":"Seed to determine unique variations on all the randomized instance angles","input_name":"Random Rotation Seed","mode":"Increment","is_integer":true},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[615144098061106242,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[10587073897090054035,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[17945736750161448391,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[18207065424980079673,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"mode":"Increment","blank_assist":true,"unit":" px","min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{"min":2.0,"mode":"Increment","is_integer":true,"blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"mode":"Increment","min":0.0,"unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":false,"unit":" px","blank_assist":true,"min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15857077552290328068,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[1984475088429379731,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"tooltip":"Artwork to be copied and placed at each point","input_name":"Instance"},"widget_override":null},{"input_data":{"mode":"Range","blank_assist":true,"unit":"x","tooltip":"Minimum range of randomized sizes given to each instance","input_name":"Random Scale Min","range_max":2.0,"min":0.0,"is_integer":false,"range_min":0.0},"widget_override":"number"},{"input_data":{"input_name":"Random Scale Max","blank_assist":true,"tooltip":"Minimum range of randomized sizes given to each instance","mode":"Range","min":0.0,"range_min":0.0,"is_integer":false,"unit":"x","range_max":2.0},"widget_override":"number"},{"input_data":{"is_integer":false,"range_max":50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","blank_assist":true,"input_name":"Random Scale Bias","mode":"Range","range_min":-50.0},"widget_override":"number"},{"input_data":{"mode":"Increment","min":0.0,"is_integer":true,"tooltip":"Seed to determine unique variations on all the randomized instance sizes","input_name":"Random Scale Seed","blank_assist":true},"widget_override":"number"},{"input_data":{"max":360.0,"min":0.0,"mode":"Range","tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","blank_assist":true,"is_integer":false,"input_name":"Random Rotation","unit":"°"},"widget_override":"number"},{"input_data":{"blank_assist":true,"is_integer":true,"min":0.0,"tooltip":"Seed to determine unique variations on all the randomized instance angles","input_name":"Random Rotation Seed","mode":"Increment"},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[2878992817082507910,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[1157261387411722141,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[10415872992231003638,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[6532401937876437300,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"unit":" px","y":"Y","x":"X","input_name":"Translation"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"y":"H","unit":"x","x":"W","input_name":"Scale"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"hidden"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11356586238302409958,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[17494926338451345058,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[454416440369338250,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15949658764632267703,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"mode":"Increment","blank_assist":true,"unit":" px","min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{"min":2.0,"mode":"Increment","is_integer":true,"blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"mode":"Increment","min":0.0,"unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":false,"unit":" px","blank_assist":true,"min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[18319784717194273926,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[9425359632144678256,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16195626650123806176,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2780251074492832077,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[7466034304713056391,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[1806828617441445250,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10586744777717861556,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"mode":"Range","input_name":"Random Scale Min","unit":"x","blank_assist":true,"is_integer":false,"min":0.0,"tooltip":"Minimum range of randomized sizes given to each instance","range_min":0.0,"range_max":2.0},"widget_override":"number"},{"input_data":{"mode":"Range","unit":"x","blank_assist":true,"is_integer":false,"range_max":2.0,"tooltip":"Minimum range of randomized sizes given to each instance","range_min":0.0,"min":0.0,"input_name":"Random Scale Max"},"widget_override":"number"},{"input_data":{"range_min":-50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","blank_assist":true,"range_max":50.0,"is_integer":false,"input_name":"Random Scale Bias","mode":"Range"},"widget_override":"number"},{"input_data":{"input_name":"Random Scale Seed","tooltip":"Seed to determine unique variations on all the randomized instance sizes","blank_assist":true,"is_integer":true,"min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{"min":0.0,"input_name":"Random Rotation","is_integer":false,"mode":"Range","tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","blank_assist":true,"max":360.0,"unit":"°"},"widget_override":"number"},{"input_data":{"blank_assist":true,"is_integer":true,"mode":"Increment","input_name":"Random Rotation Seed","tooltip":"Seed to determine unique variations on all the randomized instance angles","min":0.0},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[10689298484366290551,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4453139144069993994,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[8814059393325469059,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[3406722917122601552,{"persistent_metadata":{"reference":"Circle","display_name":"","input_properties":[{"input_data":{"input_name":"Primary"},"widget_override":null},{"input_data":{"input_name":"Radius"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-38,208]}}},"network_metadata":null}}],[8410534738018320047,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[8413863870096329943,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[17207895962122263432,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"tooltip":"Artwork to be copied and placed at each point","input_name":"Instance"},"widget_override":null},{"input_data":{"blank_assist":true,"min":0.0,"is_integer":false,"mode":"Range","range_max":2.0,"range_min":0.0,"unit":"x","input_name":"Random Scale Min","tooltip":"Minimum range of randomized sizes given to each instance"},"widget_override":"number"},{"input_data":{"tooltip":"Minimum range of randomized sizes given to each instance","input_name":"Random Scale Max","min":0.0,"range_max":2.0,"unit":"x","is_integer":false,"blank_assist":true,"range_min":0.0,"mode":"Range"},"widget_override":"number"},{"input_data":{"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","input_name":"Random Scale Bias","mode":"Range","blank_assist":true,"is_integer":false,"range_max":50.0,"range_min":-50.0},"widget_override":"number"},{"input_data":{"tooltip":"Seed to determine unique variations on all the randomized instance sizes","is_integer":true,"blank_assist":true,"min":0.0,"input_name":"Random Scale Seed","mode":"Increment"},"widget_override":"number"},{"input_data":{"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","input_name":"Random Rotation","is_integer":false,"unit":"°","blank_assist":true,"min":0.0,"max":360.0,"mode":"Range"},"widget_override":"number"},{"input_data":{"mode":"Increment","input_name":"Random Rotation Seed","is_integer":true,"min":0.0,"blank_assist":true,"tooltip":"Seed to determine unique variations on all the randomized instance angles"},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[14057307926677215422,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13014916927589286309,{"persistent_metadata":{"reference":"Scatter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"blank_assist":true,"is_integer":false,"min":0.01,"input_name":"Separation Disk Diameter","mode":"Range","range_min":1.0,"range_max":100.0},"widget_override":"number"},{"input_data":{"input_name":"Seed","blank_assist":true,"is_integer":true,"min":0.0,"mode":"Increment"},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Poisson-Disk Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14345191642063772510,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[8644924780109919177,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"mode":"Increment","blank_assist":true,"unit":" px","min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{"min":2.0,"mode":"Increment","is_integer":true,"blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"mode":"Increment","min":0.0,"unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":false,"unit":" px","blank_assist":true,"min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2440895173483452224,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[18214377096178867498,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"blank_assist":true,"min":0.0,"is_integer":false,"input_name":"Random Scale Min","range_max":2.0,"range_min":0.0,"tooltip":"Minimum range of randomized sizes given to each instance","unit":"x","mode":"Range"},"widget_override":"number"},{"input_data":{"min":0.0,"range_min":0.0,"is_integer":false,"input_name":"Random Scale Max","range_max":2.0,"blank_assist":true,"tooltip":"Minimum range of randomized sizes given to each instance","mode":"Range","unit":"x"},"widget_override":"number"},{"input_data":{"range_max":50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","is_integer":false,"mode":"Range","blank_assist":true,"input_name":"Random Scale Bias","range_min":-50.0},"widget_override":"number"},{"input_data":{"mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance sizes","blank_assist":true,"is_integer":true,"min":0.0,"input_name":"Random Scale Seed"},"widget_override":"number"},{"input_data":{"mode":"Range","input_name":"Random Rotation","tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","min":0.0,"max":360.0,"unit":"°","is_integer":false,"blank_assist":true},"widget_override":"number"},{"input_data":{"min":0.0,"mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance angles","input_name":"Random Rotation Seed","is_integer":true,"blank_assist":true},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[8375495949882478840,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14012583111791538162,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14035980686649077716,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[15637103575662751567,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[9847383247226990698,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[16536768589601337644,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[8766106989344197438,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[6867142265138950838,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[17207349373429328029,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[6645255982686652881,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10127467043900015225,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[6973438081601736688,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[1713644030979611623,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10264089084180279094,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"tooltip":"Artwork to be copied and placed at each point","input_name":"Instance"},"widget_override":null},{"input_data":{"unit":"x","range_max":2.0,"blank_assist":true,"input_name":"Random Scale Min","mode":"Range","range_min":0.0,"tooltip":"Minimum range of randomized sizes given to each instance","is_integer":false,"min":0.0},"widget_override":"number"},{"input_data":{"unit":"x","input_name":"Random Scale Max","min":0.0,"tooltip":"Minimum range of randomized sizes given to each instance","mode":"Range","is_integer":false,"range_min":0.0,"blank_assist":true,"range_max":2.0},"widget_override":"number"},{"input_data":{"mode":"Range","is_integer":false,"input_name":"Random Scale Bias","range_max":50.0,"range_min":-50.0,"blank_assist":true,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)"},"widget_override":"number"},{"input_data":{"is_integer":true,"input_name":"Random Scale Seed","mode":"Increment","blank_assist":true,"min":0.0,"tooltip":"Seed to determine unique variations on all the randomized instance sizes"},"widget_override":"number"},{"input_data":{"unit":"°","min":0.0,"blank_assist":true,"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","mode":"Range","max":360.0,"input_name":"Random Rotation","is_integer":false},"widget_override":"number"},{"input_data":{"mode":"Increment","min":0.0,"blank_assist":true,"input_name":"Random Rotation Seed","is_integer":true,"tooltip":"Seed to determine unique variations on all the randomized instance angles"},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[11573595155909211511,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"mode":"Increment","blank_assist":true,"unit":" px","min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{"min":2.0,"mode":"Increment","is_integer":true,"blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"mode":"Increment","min":0.0,"unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":false,"unit":" px","blank_assist":true,"min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[1621196991038859321,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"mode":"Increment","blank_assist":true,"unit":" px","min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{"min":2.0,"mode":"Increment","is_integer":true,"blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"mode":"Increment","min":0.0,"unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":false,"unit":" px","blank_assist":true,"min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[5302437193964714993,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"range_max":2.0,"blank_assist":true,"is_integer":false,"range_min":0.0,"min":0.0,"tooltip":"Minimum range of randomized sizes given to each instance","input_name":"Random Scale Min","mode":"Range","unit":"x"},"widget_override":"number"},{"input_data":{"is_integer":false,"min":0.0,"input_name":"Random Scale Max","blank_assist":true,"range_max":2.0,"range_min":0.0,"mode":"Range","unit":"x","tooltip":"Minimum range of randomized sizes given to each instance"},"widget_override":"number"},{"input_data":{"range_min":-50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","blank_assist":true,"range_max":50.0,"is_integer":false,"input_name":"Random Scale Bias","mode":"Range"},"widget_override":"number"},{"input_data":{"is_integer":true,"min":0.0,"mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance sizes","input_name":"Random Scale Seed","blank_assist":true},"widget_override":"number"},{"input_data":{"input_name":"Random Rotation","blank_assist":true,"unit":"°","max":360.0,"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","min":0.0,"is_integer":false,"mode":"Range"},"widget_override":"number"},{"input_data":{"blank_assist":true,"is_integer":true,"input_name":"Random Rotation Seed","mode":"Increment","min":0.0,"tooltip":"Seed to determine unique variations on all the randomized instance angles"},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[12554368619682347699,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"blank_assist":true,"input_name":"Random Scale Min","mode":"Range","unit":"x","min":0.0,"is_integer":false,"range_min":0.0,"range_max":2.0,"tooltip":"Minimum range of randomized sizes given to each instance"},"widget_override":"number"},{"input_data":{"tooltip":"Minimum range of randomized sizes given to each instance","is_integer":false,"unit":"x","input_name":"Random Scale Max","range_min":0.0,"min":0.0,"range_max":2.0,"blank_assist":true,"mode":"Range"},"widget_override":"number"},{"input_data":{"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","input_name":"Random Scale Bias","range_max":50.0,"is_integer":false,"blank_assist":true,"mode":"Range","range_min":-50.0},"widget_override":"number"},{"input_data":{"mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance sizes","is_integer":true,"input_name":"Random Scale Seed","blank_assist":true,"min":0.0},"widget_override":"number"},{"input_data":{"blank_assist":true,"mode":"Range","tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","max":360.0,"unit":"°","input_name":"Random Rotation","min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{"blank_assist":true,"min":0.0,"mode":"Increment","input_name":"Random Rotation Seed","tooltip":"Seed to determine unique variations on all the randomized instance angles","is_integer":true},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[18279507457571359732,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[11479098559726891734,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14831840560430171946,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[5269304445610080925,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"tooltip":"Artwork to be copied and placed at each point","input_name":"Instance"},"widget_override":null},{"input_data":{"min":0.0,"blank_assist":true,"range_min":0.0,"is_integer":false,"unit":"x","mode":"Range","input_name":"Random Scale Min","range_max":2.0,"tooltip":"Minimum range of randomized sizes given to each instance"},"widget_override":"number"},{"input_data":{"blank_assist":true,"min":0.0,"range_max":2.0,"range_min":0.0,"mode":"Range","unit":"x","is_integer":false,"tooltip":"Minimum range of randomized sizes given to each instance","input_name":"Random Scale Max"},"widget_override":"number"},{"input_data":{"input_name":"Random Scale Bias","is_integer":false,"mode":"Range","range_max":50.0,"range_min":-50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","blank_assist":true},"widget_override":"number"},{"input_data":{"mode":"Increment","is_integer":true,"tooltip":"Seed to determine unique variations on all the randomized instance sizes","min":0.0,"input_name":"Random Scale Seed","blank_assist":true},"widget_override":"number"},{"input_data":{"max":360.0,"unit":"°","tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","blank_assist":true,"is_integer":false,"min":0.0,"input_name":"Random Rotation","mode":"Range"},"widget_override":"number"},{"input_data":{"input_name":"Random Rotation Seed","is_integer":true,"mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance angles","min":0.0,"blank_assist":true},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[514796034658094296,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[15239301303367148581,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15896921950407486754,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14012648643507848353,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[12496143061817048445,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[3970516859959908758,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13045087323693407920,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2641530639940889619,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4663768795652429571,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15038739378867834454,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[1167210731467447244,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13045580349734858212,{"persistent_metadata":{"reference":"Scatter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"range_min":1.0,"min":0.01,"mode":"Range","input_name":"Separation Disk Diameter","range_max":100.0,"is_integer":false,"blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":true,"min":0.0,"blank_assist":true,"input_name":"Seed","mode":"Increment"},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Poisson-Disk Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15177845878727456758,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[17815494794630739611,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[15395954548128560685,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[1235106489581249820,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"mode":"Increment","blank_assist":true,"unit":" px","min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{"min":2.0,"mode":"Increment","is_integer":true,"blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"mode":"Increment","min":0.0,"unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":false,"unit":" px","blank_assist":true,"min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11021243031011826737,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[15827578515555598997,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[11899713172487274471,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[4787732047489141819,{"persistent_metadata":{"reference":"Merge","display_name":"Tucked Arm","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":24}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[9954843247420111867,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"unit":" px","input_name":"Translation","y":"Y","x":"X"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"input_name":"Scale","unit":"x","y":"H","x":"W"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"hidden"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[12385950900718181935,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[3670529450440935325,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13269760558336088742,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[1661691009086487874,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"mode":"Increment","blank_assist":true,"unit":" px","min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{"min":2.0,"mode":"Increment","is_integer":true,"blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"mode":"Increment","min":0.0,"unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":false,"unit":" px","blank_assist":true,"min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10086073308516686449,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14797986717815207528,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10599660455959346550,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[17064046832210629373,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[952330505278607301,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[3627710206997006419,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16324258033206362312,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"range_max":2.0,"tooltip":"Minimum range of randomized sizes given to each instance","min":0.0,"unit":"x","range_min":0.0,"is_integer":false,"input_name":"Random Scale Min","blank_assist":true,"mode":"Range"},"widget_override":"number"},{"input_data":{"unit":"x","input_name":"Random Scale Max","blank_assist":true,"is_integer":false,"min":0.0,"range_max":2.0,"tooltip":"Minimum range of randomized sizes given to each instance","range_min":0.0,"mode":"Range"},"widget_override":"number"},{"input_data":{"mode":"Range","is_integer":false,"input_name":"Random Scale Bias","blank_assist":true,"range_max":50.0,"range_min":-50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)"},"widget_override":"number"},{"input_data":{"min":0.0,"mode":"Increment","blank_assist":true,"is_integer":true,"tooltip":"Seed to determine unique variations on all the randomized instance sizes","input_name":"Random Scale Seed"},"widget_override":"number"},{"input_data":{"input_name":"Random Rotation","max":360.0,"min":0.0,"unit":"°","is_integer":false,"mode":"Range","tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","blank_assist":true},"widget_override":"number"},{"input_data":{"tooltip":"Seed to determine unique variations on all the randomized instance angles","blank_assist":true,"is_integer":true,"min":0.0,"input_name":"Random Rotation Seed","mode":"Increment"},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[10253927692147706615,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"unit":"x","input_name":"Random Scale Min","is_integer":false,"mode":"Range","range_max":2.0,"range_min":0.0,"tooltip":"Minimum range of randomized sizes given to each instance","blank_assist":true,"min":0.0},"widget_override":"number"},{"input_data":{"is_integer":false,"tooltip":"Minimum range of randomized sizes given to each instance","input_name":"Random Scale Max","mode":"Range","blank_assist":true,"unit":"x","range_max":2.0,"range_min":0.0,"min":0.0},"widget_override":"number"},{"input_data":{"range_min":-50.0,"mode":"Range","input_name":"Random Scale Bias","is_integer":false,"range_max":50.0,"blank_assist":true,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)"},"widget_override":"number"},{"input_data":{"min":0.0,"blank_assist":true,"input_name":"Random Scale Seed","mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance sizes","is_integer":true},"widget_override":"number"},{"input_data":{"min":0.0,"max":360.0,"unit":"°","is_integer":false,"input_name":"Random Rotation","tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","blank_assist":true,"mode":"Range"},"widget_override":"number"},{"input_data":{"input_name":"Random Rotation Seed","tooltip":"Seed to determine unique variations on all the randomized instance angles","is_integer":true,"blank_assist":true,"min":0.0,"mode":"Increment"},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[7525593029671097583,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14675232891471617236,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[7447657690776686262,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"mode":"Increment","blank_assist":true,"unit":" px","min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{"min":2.0,"mode":"Increment","is_integer":true,"blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"mode":"Increment","min":0.0,"unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":false,"unit":" px","blank_assist":true,"min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11481949351661484921,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"mode":"Increment","blank_assist":true,"unit":" px","min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{"min":2.0,"mode":"Increment","is_integer":true,"blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"mode":"Increment","min":0.0,"unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":false,"unit":" px","blank_assist":true,"min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[12880230498984021417,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"unit":"x","is_integer":false,"range_min":0.0,"tooltip":"Minimum range of randomized sizes given to each instance","range_max":2.0,"mode":"Range","input_name":"Random Scale Min","blank_assist":true,"min":0.0},"widget_override":"number"},{"input_data":{"range_min":0.0,"range_max":2.0,"blank_assist":true,"tooltip":"Minimum range of randomized sizes given to each instance","unit":"x","is_integer":false,"min":0.0,"input_name":"Random Scale Max","mode":"Range"},"widget_override":"number"},{"input_data":{"input_name":"Random Scale Bias","range_max":50.0,"mode":"Range","is_integer":false,"range_min":-50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","blank_assist":true},"widget_override":"number"},{"input_data":{"mode":"Increment","blank_assist":true,"tooltip":"Seed to determine unique variations on all the randomized instance sizes","is_integer":true,"input_name":"Random Scale Seed","min":0.0},"widget_override":"number"},{"input_data":{"input_name":"Random Rotation","min":0.0,"mode":"Range","blank_assist":true,"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","unit":"°","max":360.0,"is_integer":false},"widget_override":"number"},{"input_data":{"min":0.0,"tooltip":"Seed to determine unique variations on all the randomized instance angles","mode":"Increment","input_name":"Random Rotation Seed","is_integer":true,"blank_assist":true},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[14209241002058525241,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[18422317423856403288,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[12224498203743157414,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[12594527670567285670,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[1869448627329502330,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"is_integer":false,"min":0.0,"mode":"Range","range_max":2.0,"range_min":0.0,"blank_assist":true,"input_name":"Random Scale Min","tooltip":"Minimum range of randomized sizes given to each instance","unit":"x"},"widget_override":"number"},{"input_data":{"range_min":0.0,"min":0.0,"mode":"Range","blank_assist":true,"is_integer":false,"tooltip":"Minimum range of randomized sizes given to each instance","unit":"x","input_name":"Random Scale Max","range_max":2.0},"widget_override":"number"},{"input_data":{"is_integer":false,"range_min":-50.0,"input_name":"Random Scale Bias","blank_assist":true,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","range_max":50.0,"mode":"Range"},"widget_override":"number"},{"input_data":{"blank_assist":true,"is_integer":true,"tooltip":"Seed to determine unique variations on all the randomized instance sizes","min":0.0,"input_name":"Random Scale Seed","mode":"Increment"},"widget_override":"number"},{"input_data":{"unit":"°","mode":"Range","min":0.0,"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","is_integer":false,"max":360.0,"blank_assist":true,"input_name":"Random Rotation"},"widget_override":"number"},{"input_data":{"min":0.0,"blank_assist":true,"mode":"Increment","is_integer":true,"input_name":"Random Rotation Seed","tooltip":"Seed to determine unique variations on all the randomized instance angles"},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[16175421708184657649,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16137033772363318157,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4493274523708782092,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[12131058586835568367,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15303587427289959766,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4577638792388493935,{"persistent_metadata":{"reference":"Merge","display_name":"Head and Neck","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":78}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[3649809135741361946,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14946189826912398678,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[5278509881589546420,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16290933138334939444,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14991324592500870173,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11659756061767599421,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[13557369662261607646,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[7505360855062237520,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[2282726379014798660,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"mode":"Increment","blank_assist":true,"unit":" px","min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{"min":2.0,"mode":"Increment","is_integer":true,"blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"mode":"Increment","min":0.0,"unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":false,"unit":" px","blank_assist":true,"min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[3686761601672683183,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"mode":"Increment","blank_assist":true,"unit":" px","min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{"min":2.0,"mode":"Increment","is_integer":true,"blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"mode":"Increment","min":0.0,"unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":false,"unit":" px","blank_assist":true,"min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14537754528543289381,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10860592954464951000,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[16551385471328831128,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[12062649793560663566,{"persistent_metadata":{"reference":"Merge","display_name":"Solid Red Skirt","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":3}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[17118107476414252025,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"x":"X","y":"Y","input_name":"Translation","unit":" px"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"y":"H","unit":"x","input_name":"Scale","x":"W"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"hidden"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[3414873131936208778,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15460109068588328521,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[3827449344952693766,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"mode":"Increment","blank_assist":true,"unit":" px","min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{"min":2.0,"mode":"Increment","is_integer":true,"blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"mode":"Increment","min":0.0,"unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":false,"unit":" px","blank_assist":true,"min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13352561089252322209,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[9371909264427723282,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[1019037285881657884,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"tooltip":"Artwork to be copied and placed at each point","input_name":"Instance"},"widget_override":null},{"input_data":{"range_max":2.0,"blank_assist":true,"tooltip":"Minimum range of randomized sizes given to each instance","is_integer":false,"range_min":0.0,"mode":"Range","unit":"x","input_name":"Random Scale Min","min":0.0},"widget_override":"number"},{"input_data":{"tooltip":"Minimum range of randomized sizes given to each instance","unit":"x","min":0.0,"blank_assist":true,"range_max":2.0,"mode":"Range","range_min":0.0,"input_name":"Random Scale Max","is_integer":false},"widget_override":"number"},{"input_data":{"is_integer":false,"mode":"Range","range_max":50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","blank_assist":true,"input_name":"Random Scale Bias","range_min":-50.0},"widget_override":"number"},{"input_data":{"blank_assist":true,"mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance sizes","min":0.0,"input_name":"Random Scale Seed","is_integer":true},"widget_override":"number"},{"input_data":{"input_name":"Random Rotation","mode":"Range","tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","is_integer":false,"max":360.0,"blank_assist":true,"unit":"°","min":0.0},"widget_override":"number"},{"input_data":{"min":0.0,"mode":"Increment","input_name":"Random Rotation Seed","blank_assist":true,"tooltip":"Seed to determine unique variations on all the randomized instance angles","is_integer":true},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[14079496619264986678,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11417901103965737900,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"mode":"Increment","blank_assist":true,"unit":" px","min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{"min":2.0,"mode":"Increment","is_integer":true,"blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"mode":"Increment","min":0.0,"unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":false,"unit":" px","blank_assist":true,"min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14598755603287563819,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[10918055532782314571,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"input_name":"Instance","tooltip":"Artwork to be copied and placed at each point"},"widget_override":null},{"input_data":{"unit":"x","is_integer":false,"tooltip":"Minimum range of randomized sizes given to each instance","input_name":"Random Scale Min","min":0.0,"mode":"Range","blank_assist":true,"range_max":2.0,"range_min":0.0},"widget_override":"number"},{"input_data":{"mode":"Range","is_integer":false,"blank_assist":true,"tooltip":"Minimum range of randomized sizes given to each instance","input_name":"Random Scale Max","min":0.0,"range_max":2.0,"range_min":0.0,"unit":"x"},"widget_override":"number"},{"input_data":{"mode":"Range","range_max":50.0,"input_name":"Random Scale Bias","is_integer":false,"blank_assist":true,"range_min":-50.0,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)"},"widget_override":"number"},{"input_data":{"min":0.0,"mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance sizes","blank_assist":true,"is_integer":true,"input_name":"Random Scale Seed"},"widget_override":"number"},{"input_data":{"unit":"°","min":0.0,"blank_assist":true,"is_integer":false,"tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise","input_name":"Random Rotation","max":360.0,"mode":"Range"},"widget_override":"number"},{"input_data":{"tooltip":"Seed to determine unique variations on all the randomized instance angles","input_name":"Random Rotation Seed","blank_assist":true,"is_integer":true,"min":0.0,"mode":"Increment"},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[15126865253122550765,{"persistent_metadata":{"reference":"Merge","display_name":"Dotted Bodice","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":21}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[1659518581611333812,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[1689789805659535712,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[7262199696924786895,{"persistent_metadata":{"reference":"Sample Polyline","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{"mode":"Increment","blank_assist":true,"unit":" px","min":0.0,"is_integer":false},"widget_override":"number"},{"input_data":{"min":2.0,"mode":"Increment","is_integer":true,"blank_assist":true},"widget_override":"number"},{"input_data":{"is_integer":false,"blank_assist":true,"mode":"Increment","min":0.0,"unit":" px"},"widget_override":"number"},{"input_data":{"is_integer":false,"unit":" px","blank_assist":true,"min":0.0,"mode":"Increment"},"widget_override":"number"},{"input_data":{},"widget_override":null}],"output_names":["Vector"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Subpath Segment Lengths","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,7]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Sample Polyline","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[4,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[28,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11553850607251055696,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4265165189651403984,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[9276497172451351253,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[1162381870526064378,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[6672826052605647592,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13163272246010991228,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[3150436463719911922,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{"unit":" px","x":"X","y":"Y"},"widget_override":"vec2"},{"input_data":{},"widget_override":"transform_rotation"},{"input_data":{"unit":"x","x":"W","y":"H"},"widget_override":"vec2"},{"input_data":{},"widget_override":"transform_skew"},{"input_data":{},"widget_override":"hidden"}],"output_names":["Data"],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null},{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[314278016428495768,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[17891208858820401648,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Translation","x":"X","y":"Y","unit":" px"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"input_name":"Scale","unit":"x","y":"H","x":"W"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"hidden"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15656854169166220905,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"x":"X","y":"Y","input_name":"Translation","unit":" px"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"unit":"x","input_name":"Scale","y":"H","x":"W"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"hidden"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[9470742171134780193,{"persistent_metadata":{"reference":"Merge","display_name":"Dotted Skirt","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":81}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10619788176782820865,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[7320676248579211727,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[3226457726231232839,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14778750092903591172,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[15735375935164094402,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[4307303572241320716,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Absolute":[-17,319]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[7385465194555106679,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Absolute":[-17,211]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13444661581815146533,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Absolute":[-17,97]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[17336535036064625290,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Translation","x":"X","unit":" px","y":"Y"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"unit":"x","x":"W","y":"H","input_name":"Scale"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"hidden"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10795820039540504703,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4479074488343511985,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[16796171662855500935,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[6292009934909381201,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Absolute":[-17,88]}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[8543051864256131356,{"persistent_metadata":{"reference":"Copy to Points","display_name":"","input_properties":[{"input_data":{"input_name":"Points"},"widget_override":null},{"input_data":{"tooltip":"Artwork to be copied and placed at each point","input_name":"Instance"},"widget_override":null},{"input_data":{"min":0.0,"mode":"Range","unit":"x","range_max":2.0,"blank_assist":true,"tooltip":"Minimum range of randomized sizes given to each instance","input_name":"Random Scale Min","is_integer":false,"range_min":0.0},"widget_override":"number"},{"input_data":{"range_max":2.0,"unit":"x","mode":"Range","range_min":0.0,"min":0.0,"blank_assist":true,"is_integer":false,"tooltip":"Minimum range of randomized sizes given to each instance","input_name":"Random Scale Max"},"widget_override":"number"},{"input_data":{"range_max":50.0,"range_min":-50.0,"blank_assist":true,"tooltip":"Bias for the probability distribution of randomized sizes (0 is uniform, negatives favor more of small sizes, positives favor more of large sizes)","mode":"Range","input_name":"Random Scale Bias","is_integer":false},"widget_override":"number"},{"input_data":{"is_integer":true,"blank_assist":true,"mode":"Increment","tooltip":"Seed to determine unique variations on all the randomized instance sizes","min":0.0,"input_name":"Random Scale Seed"},"widget_override":"number"},{"input_data":{"min":0.0,"unit":"°","max":360.0,"blank_assist":true,"is_integer":false,"input_name":"Random Rotation","mode":"Range","tooltip":"Range of randomized angles given to each instance, in degrees ranging from furthest clockwise to counterclockwise"},"widget_override":"number"},{"input_data":{"input_name":"Random Rotation Seed","min":0.0,"mode":"Increment","blank_assist":true,"is_integer":true,"tooltip":"Seed to determine unique variations on all the randomized instance angles"},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[14993053984267866751,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10770443343193024138,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[14225285635863713990,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"unit":" px","x":"X","y":"Y","input_name":"Translation"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"x":"W","unit":"x","input_name":"Scale","y":"H"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"hidden"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[12531351117929704587,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[16530658574540156160,{"persistent_metadata":{"reference":"Transform","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"unit":" px","y":"Y","input_name":"Translation","x":"X"},"widget_override":"vec2"},{"input_data":{"input_name":"Rotation"},"widget_override":"transform_rotation"},{"input_data":{"x":"W","unit":"x","y":"H","input_name":"Scale"},"widget_override":"vec2"},{"input_data":{"input_name":"Skew"},"widget_override":"hidden"},{"input_data":{"input_name":"Pivot"},"widget_override":"hidden"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Transform","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[11666664915283969027,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[3802858053991775169,{"persistent_metadata":{"reference":"Scatter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"blank_assist":true,"range_min":1.0,"input_name":"Separation Disk Diameter","mode":"Range","min":0.01,"is_integer":false,"range_max":100.0},"widget_override":"number"},{"input_data":{"input_name":"Seed","blank_assist":true,"is_integer":true,"min":0.0,"mode":"Increment"},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"Poisson-Disk Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[8230694129617719636,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16614450796751955858,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[13231685386999438557,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[7747398671834040298,{"persistent_metadata":{"reference":"Scatter Points","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"min":0.01,"range_max":100.0,"is_integer":false,"blank_assist":true,"input_name":"Separation Disk Diameter","mode":"Range","range_min":1.0},"widget_override":"number"},{"input_data":{"input_name":"Seed","is_integer":true,"min":0.0,"mode":"Increment","blank_assist":true},"widget_override":"number"}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Memoize","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Freeze Real Time","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[14,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Poisson-Disk Points","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Boundless Footprint","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[21,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[10420981328998103391,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[16339345235172368839,{"persistent_metadata":{"reference":"Fill","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Fill"},"widget_override":null},{"input_data":{"input_name":"Backup Color"},"widget_override":null},{"input_data":{"input_name":"Backup Gradient"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":null}}],[1384427686127078856,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[4105711298139980122,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[2044103368441997753,{"persistent_metadata":{"reference":"Path","display_name":"","input_properties":[{"input_data":{"input_name":"Vector Data"},"widget_override":null},{"input_data":{"input_name":"Modification"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":"Chain"}},"network_metadata":{"persistent_metadata":{"node_metadata":[[1,{"persistent_metadata":{"reference":null,"display_name":"Path Modify","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[7,0]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[0,0]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[12387541320114693418,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}],[5471152581000334146,{"persistent_metadata":{"reference":"Merge","display_name":"","input_properties":[{"input_data":{"input_name":"Graphical Data"},"widget_override":null},{"input_data":{"input_name":"Over"},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Layer":{"position":{"Stack":0}}},"network_metadata":{"persistent_metadata":{"node_metadata":[[0,{"persistent_metadata":{"reference":null,"display_name":"To Element","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-1]}}},"network_metadata":null}}],[1,{"persistent_metadata":{"reference":null,"display_name":"To Group","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-14,-3]}}},"network_metadata":null}}],[2,{"persistent_metadata":{"reference":null,"display_name":"Monitor","input_properties":[{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[-7,-1]}}},"network_metadata":null}}],[3,{"persistent_metadata":{"reference":null,"display_name":"Layer","input_properties":[{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null},{"input_data":{"input_name":""},"widget_override":null}],"output_names":[],"has_primary_output":true,"locked":false,"pinned":false,"node_type_metadata":{"Node":{"position":{"Absolute":[1,-3]}}},"network_metadata":null}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[0.0,0.0],"tilt":0.0,"zoom":1.0,"flip":false},"node_graph_to_viewport":[1.0,0.0,0.0,1.0,0.0,0.0],"node_graph_top_right":[0.0,0.0]},"selection_undo_history":[],"selection_redo_history":[]}}}}]],"previewing":"No","navigation_metadata":{"node_graph_ptz":{"pan":[737.4067596403,-6318.358748666366],"tilt":0.0,"zoom":0.6328125,"flip":false},"node_graph_to_viewport":[0.6328125,0.0,0.0,0.6328125,1457.0,-3418.0],"node_graph_top_right":[1980.796875,0.0]},"selection_undo_history":[[3457800614598085282],[17426704671299246894],[2699408592782313690],[4493274523708782092],[14031411536409518176],[13263961817794116841],[835795066714655983],[11477846841203274509],[727544715487174952],[6480666310383891203],[15086626938904467381],[12994398686940961368],[15086626938904467381],[],[12994398686940961368],[],[5140869461760168364],[11677503666435782605],[776454851019809551],[],[10662978266497754900],[],[13201515093260842314],[],[3932608775253338292],[],[8090442493082590595],[],[17545135276965178247],[4332145463108161926],[],[4332145463108161926],[],[4332145463108161926],[],[11356586238302409958,10086073308516686449],[],[4332145463108161926],[],[3406722917122601552],[4332145463108161926],[],[4332145463108161926],[],[10086073308516686449],[17545135276965178247],[],[17078740291337047697],[3457800614598085282],[3457800614598085282,17426704671299246894],[3457800614598085282,17426704671299246894,2699408592782313690],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,15239301303367148581],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,15239301303367148581,13263961817794116841],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,15239301303367148581,13263961817794116841],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509,727544715487174952],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509,727544715487174952,6480666310383891203],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509,727544715487174952,6480666310383891203,10550662778443296023],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509,727544715487174952,6480666310383891203,10550662778443296023,13185163654003144011],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509,727544715487174952,6480666310383891203,10550662778443296023,13185163654003144011,3559656994078944914],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509,727544715487174952,6480666310383891203,10550662778443296023,13185163654003144011,3559656994078944914,12747708470463124971],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509,727544715487174952,6480666310383891203,10550662778443296023,13185163654003144011,3559656994078944914,12747708470463124971,898580338082782932],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509,727544715487174952,6480666310383891203,10550662778443296023,13185163654003144011,3559656994078944914,12747708470463124971,898580338082782932,17099718003896986529],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509,727544715487174952,6480666310383891203,10550662778443296023,13185163654003144011,3559656994078944914,12747708470463124971,898580338082782932,17099718003896986529,1510915657479425828],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509,727544715487174952,6480666310383891203,10550662778443296023,13185163654003144011,3559656994078944914,12747708470463124971,898580338082782932,17099718003896986529,1510915657479425828,770786980744949903],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509,727544715487174952,6480666310383891203,10550662778443296023,13185163654003144011,3559656994078944914,12747708470463124971,898580338082782932,17099718003896986529,1510915657479425828,770786980744949903,5742628441455317378],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509,727544715487174952,6480666310383891203,10550662778443296023,13185163654003144011,3559656994078944914,12747708470463124971,898580338082782932,17099718003896986529,1510915657479425828,770786980744949903,5742628441455317378,12579808169500774530],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509,727544715487174952,6480666310383891203,10550662778443296023,13185163654003144011,3559656994078944914,12747708470463124971,898580338082782932,17099718003896986529,1510915657479425828,770786980744949903,5742628441455317378,12579808169500774530,862014397356527450],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509,727544715487174952,6480666310383891203,10550662778443296023,13185163654003144011,3559656994078944914,12747708470463124971,898580338082782932,17099718003896986529,1510915657479425828,770786980744949903,5742628441455317378,12579808169500774530,862014397356527450,13790235862723082076],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509,727544715487174952,6480666310383891203,10550662778443296023,13185163654003144011,3559656994078944914,12747708470463124971,898580338082782932,17099718003896986529,1510915657479425828,770786980744949903,5742628441455317378,12579808169500774530,862014397356527450,13790235862723082076,9531720291230511752],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509,727544715487174952,6480666310383891203,10550662778443296023,13185163654003144011,3559656994078944914,12747708470463124971,898580338082782932,17099718003896986529,1510915657479425828,770786980744949903,5742628441455317378,12579808169500774530,862014397356527450,13790235862723082076,9531720291230511752,12792838691218304039],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509,727544715487174952,6480666310383891203,10550662778443296023,13185163654003144011,3559656994078944914,12747708470463124971,898580338082782932,17099718003896986529,1510915657479425828,770786980744949903,5742628441455317378,12579808169500774530,862014397356527450,13790235862723082076,9531720291230511752,12792838691218304039,5102308641931177440],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509,727544715487174952,6480666310383891203,10550662778443296023,13185163654003144011,3559656994078944914,12747708470463124971,898580338082782932,17099718003896986529,1510915657479425828,770786980744949903,5742628441455317378,12579808169500774530,862014397356527450,13790235862723082076,9531720291230511752,12792838691218304039,5102308641931177440,14480644719732559657],[3457800614598085282,17426704671299246894,2699408592782313690,14031411536409518176,13263961817794116841,835795066714655983,11477846841203274509,727544715487174952,6480666310383891203,10550662778443296023,13185163654003144011,3559656994078944914,12747708470463124971,898580338082782932,17099718003896986529,1510915657479425828,770786980744949903,5742628441455317378,12579808169500774530,862014397356527450,13790235862723082076,9531720291230511752,12792838691218304039,5102308641931177440,14480644719732559657,3601587624047636241],[],[17078740291337047697],[3406722917122601552],[],[9470742171134780193],[14883504161508594099],[],[13163272246010991228],[],[4332145463108161926],[17078740291337047697],[],[],[17078740291337047697,3406722917122601552],[],[9470742171134780193],[13368990606109678244],[9470742171134780193],[14883504161508594099],[421715625023770179],[3670529450440935325],[4265165189651403984],[]],"selection_redo_history":[]}}},"collapsed":[4422453582814483233,4577638792388493936,3170924135668664008,4787732047489141820,12062649793560663567,5455777299776842372,9470742171134780194,15126865253122550766,13014628586360765652],"name":"Red Dress","commit_hash":"8fa46ba63a69bb5fa18a49194cf112d963a2d43b","document_ptz":{"pan":[-512.5,-515.648496025349],"tilt":0.0,"zoom":1.0,"flip":false},"document_mode":"DesignMode","view_mode":"Normal","overlays_visibility_settings":{"all":true,"artboard_name":true,"compass_rose":true,"quick_measurement":true,"transform_measurement":true,"transform_cage":true,"hover_outline":true,"selection_outline":true,"pivot":true,"path":true,"anchors":true,"handles":true},"rulers_visible":true,"snapping_state":{"snapping_enabled":false,"grid_snapping":false,"artboards":true,"tolerance":8.0,"bounding_box":{"center_point":true,"corner_point":true,"edge_midpoint":true,"align_with_edges":true,"distribute_evenly":true},"path":{"anchor_point":true,"line_midpoint":true,"along_path":true,"normal_to_path":true,"tangent_to_path":true,"path_intersection_point":true,"align_with_anchor_point":true,"perpendicular_from_endpoint":true},"grid":{"origin":[0.0,0.0],"grid_type":{"Rectangular":{"spacing":[1.0,1.0]}},"rectangular_spacing":[1.0,1.0],"isometric_y_spacing":1.0,"isometric_angle_a":30.0,"isometric_angle_b":30.0,"grid_color":{"red":0.6038274,"green":0.6038274,"blue":0.6038274,"alpha":1.0},"dot_display":false}},"graph_view_overlay_open":false,"graph_fade_artwork_percentage":80.0} \ No newline at end of file diff --git a/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs b/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs index af8f6bd130..729334dc52 100644 --- a/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs +++ b/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs @@ -1822,12 +1822,12 @@ fn static_nodes() -> Vec { properties: None, }, DocumentNodeDefinition { - identifier: "Sample Points", + identifier: "Sample Polyline", category: "Vector: Modifier", node_template: NodeTemplate { document_node: DocumentNode { implementation: DocumentNodeImplementation::Network(NodeNetwork { - exports: vec![NodeInput::node(NodeId(4), 0)], // Taken from output 0 of Sample Points + exports: vec![NodeInput::node(NodeId(4), 0)], nodes: [ DocumentNode { inputs: vec![NodeInput::network(concrete!(graphene_std::vector::VectorDataTable), 0)], @@ -1838,13 +1838,15 @@ fn static_nodes() -> Vec { DocumentNode { inputs: vec![ NodeInput::network(concrete!(graphene_std::vector::VectorDataTable), 0), - NodeInput::network(concrete!(f64), 1), // From the document node's parameters - NodeInput::network(concrete!(f64), 2), // From the document node's parameters - NodeInput::network(concrete!(f64), 3), // From the document node's parameters - NodeInput::network(concrete!(bool), 4), // From the document node's parameters - NodeInput::node(NodeId(0), 0), // From output 0 of SubpathSegmentLengthsNode + NodeInput::network(concrete!(vector::misc::PointSpacingType), 1), + NodeInput::network(concrete!(f64), 2), + NodeInput::network(concrete!(f64), 3), + NodeInput::network(concrete!(f64), 4), + NodeInput::network(concrete!(f64), 5), + NodeInput::network(concrete!(bool), 6), + NodeInput::node(NodeId(0), 0), ], - implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::vector::SamplePointsNode")), + implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::vector::SamplePolylineNode")), manual_composition: Some(generic!(T)), ..Default::default() }, @@ -1875,6 +1877,8 @@ fn static_nodes() -> Vec { }), inputs: vec![ NodeInput::value(TaggedValue::VectorData(graphene_std::vector::VectorDataTable::default()), true), + NodeInput::value(TaggedValue::PointSpacingType(Default::default()), false), + NodeInput::value(TaggedValue::F64(100.), false), NodeInput::value(TaggedValue::F64(100.), false), NodeInput::value(TaggedValue::F64(0.), false), NodeInput::value(TaggedValue::F64(0.), false), @@ -1889,14 +1893,14 @@ fn static_nodes() -> Vec { DocumentNodeMetadata { persistent_metadata: DocumentNodePersistentMetadata { display_name: "Subpath Segment Lengths".to_string(), - node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(0, 5)), + node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(0, 7)), ..Default::default() }, ..Default::default() }, DocumentNodeMetadata { persistent_metadata: DocumentNodePersistentMetadata { - display_name: "Sample Points".to_string(), + display_name: "Sample Polyline".to_string(), node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(7, 0)), ..Default::default() }, @@ -1937,18 +1941,28 @@ fn static_nodes() -> Vec { }), input_properties: vec![ ("Vector Data", "The shape to be resampled and converted into a polyline.").into(), + Into::::into(("Spacing", node_properties::SAMPLE_POLYLINE_TOOLTIP_SPACING)), PropertiesRow::with_override( - "Spacing", - "Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled).", + "Separation", + node_properties::SAMPLE_POLYLINE_TOOLTIP_SEPARATION, WidgetOverride::Number(NumberInputSettings { - min: Some(1.), + min: Some(0.), unit: Some(" px".to_string()), ..Default::default() }), ), + PropertiesRow::with_override( + "Quantity", + node_properties::SAMPLE_POLYLINE_TOOLTIP_QUANTITY, + WidgetOverride::Number(NumberInputSettings { + min: Some(2.), + is_integer: true, + ..Default::default() + }), + ), PropertiesRow::with_override( "Start Offset", - "Exclude some distance from the start of the path before the first instance.", + node_properties::SAMPLE_POLYLINE_TOOLTIP_START_OFFSET, WidgetOverride::Number(NumberInputSettings { min: Some(0.), unit: Some(" px".to_string()), @@ -1957,21 +1971,21 @@ fn static_nodes() -> Vec { ), PropertiesRow::with_override( "Stop Offset", - "Exclude some distance from the end of the path after the last instance.", + node_properties::SAMPLE_POLYLINE_TOOLTIP_STOP_OFFSET, WidgetOverride::Number(NumberInputSettings { min: Some(0.), unit: Some(" px".to_string()), ..Default::default() }), ), - Into::::into(("Adaptive Spacing", "Round 'Spacing' to a nearby value that divides into the path length evenly.")), + Into::::into(("Adaptive Spacing", node_properties::SAMPLE_POLYLINE_TOOLTIP_ADAPTIVE_SPACING)), ], output_names: vec!["Vector".to_string()], ..Default::default() }, }, description: Cow::Borrowed("Convert vector geometry into a polyline composed of evenly spaced points."), - properties: None, + properties: Some("sample_polyline_properties"), }, DocumentNodeDefinition { identifier: "Scatter Points", @@ -2344,6 +2358,7 @@ fn static_node_properties() -> NodeProperties { map.insert("math_properties".to_string(), Box::new(node_properties::math_properties)); map.insert("rectangle_properties".to_string(), Box::new(node_properties::rectangle_properties)); map.insert("grid_properties".to_string(), Box::new(node_properties::grid_properties)); + map.insert("sample_polyline_properties".to_string(), Box::new(node_properties::sample_polyline_properties)); map.insert( "identity_properties".to_string(), Box::new(|_node_id, _context| node_properties::string_properties("The identity node simply passes its data through.")), diff --git a/editor/src/messages/portfolio/document/node_graph/node_properties.rs b/editor/src/messages/portfolio/document/node_graph/node_properties.rs index 4b4b946982..226931dde0 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_properties.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_properties.rs @@ -22,9 +22,9 @@ use graphene_std::raster_types::{CPU, GPU, RasterDataTable}; use graphene_std::text::Font; use graphene_std::transform::{Footprint, ReferencePoint}; use graphene_std::vector::VectorDataTable; -use graphene_std::vector::misc::CentroidType; use graphene_std::vector::misc::{ArcType, MergeByDistanceAlgorithm}; use graphene_std::vector::misc::{BooleanOperation, GridType}; +use graphene_std::vector::misc::{CentroidType, PointSpacingType}; use graphene_std::vector::style::{Fill, FillChoice, FillType, GradientStops}; use graphene_std::vector::style::{GradientType, PaintOrder, StrokeAlign, StrokeCap, StrokeJoin}; use graphene_std::{GraphicGroupTable, NodeInputDecleration}; @@ -238,6 +238,7 @@ pub(crate) fn property_from_type( Some(x) if x == TypeId::of::() => enum_choice::().for_socket(default_info).property_row(), Some(x) if x == TypeId::of::() => enum_choice::().for_socket(default_info).property_row(), Some(x) if x == TypeId::of::() => enum_choice::().for_socket(default_info).property_row(), + Some(x) if x == TypeId::of::() => enum_choice::().for_socket(default_info).property_row(), Some(x) if x == TypeId::of::() => enum_choice::().for_socket(default_info).property_row(), Some(x) if x == TypeId::of::() => enum_choice::().for_socket(default_info).property_row(), Some(x) if x == TypeId::of::() => enum_choice::().for_socket(default_info).property_row(), @@ -1225,6 +1226,64 @@ pub(crate) fn grid_properties(node_id: NodeId, context: &mut NodePropertiesConte widgets } +pub(crate) const SAMPLE_POLYLINE_TOOLTIP_SPACING: &str = "Use a point sampling density controlled by a distance between, or specific number of, points."; +pub(crate) const SAMPLE_POLYLINE_TOOLTIP_SEPARATION: &str = "Distance between each instance (exact if 'Adaptive Spacing' is disabled, approximate if enabled)."; +pub(crate) const SAMPLE_POLYLINE_TOOLTIP_QUANTITY: &str = "Number of points to place along the path."; +pub(crate) const SAMPLE_POLYLINE_TOOLTIP_START_OFFSET: &str = "Exclude some distance from the start of the path before the first instance."; +pub(crate) const SAMPLE_POLYLINE_TOOLTIP_STOP_OFFSET: &str = "Exclude some distance from the end of the path after the last instance."; +pub(crate) const SAMPLE_POLYLINE_TOOLTIP_ADAPTIVE_SPACING: &str = "Round 'Separation' to a nearby value that divides into the path length evenly."; + +pub(crate) fn sample_polyline_properties(node_id: NodeId, context: &mut NodePropertiesContext) -> Vec { + use graphene_std::vector::sample_polyline::*; + + let document_node = match get_document_node(node_id, context) { + Ok(document_node) => document_node, + Err(err) => { + log::error!("Could not get document node in sample_polyline_properties: {err}"); + return Vec::new(); + } + }; + + let current_spacing = document_node.inputs.get(SpacingInput::INDEX).and_then(|input| input.as_value()).cloned(); + let is_quantity = matches!(current_spacing, Some(TaggedValue::PointSpacingType(PointSpacingType::Quantity))); + + let spacing = enum_choice::() + .for_socket(ParameterWidgetsInfo::from_index(document_node, node_id, SpacingInput::INDEX, true, context)) + .property_row(); + let separation = number_widget( + ParameterWidgetsInfo::from_index(document_node, node_id, SeparationInput::INDEX, true, context), + NumberInput::default().min(0.).unit(" px"), + ); + let quantity = number_widget( + ParameterWidgetsInfo::from_index(document_node, node_id, QuantityInput::INDEX, true, context), + NumberInput::default().min(2.).int(), + ); + let start_offset = number_widget( + ParameterWidgetsInfo::from_index(document_node, node_id, StartOffsetInput::INDEX, true, context), + NumberInput::default().min(0.).unit(" px"), + ); + let stop_offset = number_widget( + ParameterWidgetsInfo::from_index(document_node, node_id, StopOffsetInput::INDEX, true, context), + NumberInput::default().min(0.).unit(" px"), + ); + let adaptive_spacing = bool_widget( + ParameterWidgetsInfo::from_index(document_node, node_id, AdaptiveSpacingInput::INDEX, true, context), + CheckboxInput::default().disabled(is_quantity), + ); + + vec![ + spacing.with_tooltip(SAMPLE_POLYLINE_TOOLTIP_SPACING), + match current_spacing { + Some(TaggedValue::PointSpacingType(PointSpacingType::Separation)) => LayoutGroup::Row { widgets: separation }.with_tooltip(SAMPLE_POLYLINE_TOOLTIP_SEPARATION), + Some(TaggedValue::PointSpacingType(PointSpacingType::Quantity)) => LayoutGroup::Row { widgets: quantity }.with_tooltip(SAMPLE_POLYLINE_TOOLTIP_QUANTITY), + _ => LayoutGroup::Row { widgets: vec![] }, + }, + LayoutGroup::Row { widgets: start_offset }.with_tooltip(SAMPLE_POLYLINE_TOOLTIP_START_OFFSET), + LayoutGroup::Row { widgets: stop_offset }.with_tooltip(SAMPLE_POLYLINE_TOOLTIP_STOP_OFFSET), + LayoutGroup::Row { widgets: adaptive_spacing }.with_tooltip(SAMPLE_POLYLINE_TOOLTIP_ADAPTIVE_SPACING), + ] +} + pub(crate) fn exposure_properties(node_id: NodeId, context: &mut NodePropertiesContext) -> Vec { use graphene_std::raster::exposure::*; diff --git a/editor/src/messages/portfolio/portfolio_message_handler.rs b/editor/src/messages/portfolio/portfolio_message_handler.rs index e834f0da23..0ad1a7d08e 100644 --- a/editor/src/messages/portfolio/portfolio_message_handler.rs +++ b/editor/src/messages/portfolio/portfolio_message_handler.rs @@ -441,7 +441,7 @@ impl MessageHandler> for PortfolioMes let document_name = document_name.replace("__DO_NOT_UPGRADE__", ""); const TEXT_REPLACEMENTS: [(&str, &str); 2] = [ - ("graphene_core::vector::vector_nodes::SamplePointsNode", "graphene_core::vector::SamplePointsNode"), + ("graphene_core::vector::vector_nodes::SamplePointsNode", "graphene_core::vector::SamplePolylineNode"), ("graphene_core::vector::vector_nodes::SubpathSegmentLengthsNode", "graphene_core::vector::SubpathSegmentLengthsNode"), ]; let document_serialized_content = TEXT_REPLACEMENTS @@ -1074,6 +1074,31 @@ impl MessageHandler> for PortfolioMes document.network_interface.replace_reference_name(node_id, network_path, "Merge by Distance".to_string()); } + + if reference == "Sample Points" && inputs_count == 5 { + // TODO: Rename to "Sample Polyline", also remove segment generation from "Scatter Points" + let node_definition = resolve_document_node_type("Sample Polyline").unwrap(); + let new_node_template = node_definition.default_node_template(); + let document_node = new_node_template.document_node; + document.network_interface.replace_implementation(node_id, network_path, document_node.implementation.clone()); + document + .network_interface + .replace_implementation_metadata(node_id, network_path, new_node_template.persistent_node_metadata); + + let old_inputs = document.network_interface.replace_inputs(node_id, document_node.inputs.clone(), network_path); + let new_spacing_value = NodeInput::value(TaggedValue::PointSpacingType(graphene_std::vector::misc::PointSpacingType::Separation), false); + + document.network_interface.set_input(&InputConnector::node(*node_id, 0), old_inputs[0].clone(), network_path); + document.network_interface.set_input(&InputConnector::node(*node_id, 1), new_spacing_value, network_path); + document.network_interface.set_input(&InputConnector::node(*node_id, 2), old_inputs[1].clone(), network_path); + document.network_interface.set_input(&InputConnector::node(*node_id, 3), old_inputs[1].clone(), network_path); + document.network_interface.set_input(&InputConnector::node(*node_id, 4), old_inputs[2].clone(), network_path); + document.network_interface.set_input(&InputConnector::node(*node_id, 5), old_inputs[3].clone(), network_path); + document.network_interface.set_input(&InputConnector::node(*node_id, 6), old_inputs[4].clone(), network_path); + + // TODO: Rename to "Sample Polyline", also remove segment generation from "Scatter Points" + document.network_interface.replace_reference_name(node_id, network_path, "Sample Polyline".to_string()); + } } // TODO: Eventually remove this document upgrade code diff --git a/node-graph/gcore/src/logic.rs b/node-graph/gcore/src/logic.rs index 727e3d0b8b..a9a7f4d37c 100644 --- a/node-graph/gcore/src/logic.rs +++ b/node-graph/gcore/src/logic.rs @@ -2,7 +2,7 @@ use crate::vector::VectorDataTable; use crate::{Color, Context, Ctx}; use glam::{DAffine2, DVec2}; -#[node_macro::node(category("Debug"))] +#[node_macro::node(category("Debug"), name("Log to Console"))] fn log_to_console(_: impl Ctx, #[implementations(String, bool, f64, u32, u64, DVec2, VectorDataTable, DAffine2, Color, Option)] value: T) -> T { // KEEP THIS `debug!()` - It acts as the output for the debug node itself log::debug!("{:#?}", value); diff --git a/node-graph/gcore/src/vector/algorithms/bezpath_algorithms.rs b/node-graph/gcore/src/vector/algorithms/bezpath_algorithms.rs index fa7682e63b..fa8af0f6d5 100644 --- a/node-graph/gcore/src/vector/algorithms/bezpath_algorithms.rs +++ b/node-graph/gcore/src/vector/algorithms/bezpath_algorithms.rs @@ -1,5 +1,5 @@ use super::poisson_disk::poisson_disk_sample; -use crate::vector::misc::dvec2_to_point; +use crate::vector::misc::{PointSpacingType, dvec2_to_point}; use glam::DVec2; use kurbo::{BezPath, DEFAULT_ACCURACY, Line, ParamCurve, ParamCurveDeriv, PathEl, PathSeg, Point, Rect, Shape}; @@ -67,7 +67,15 @@ pub fn tangent_on_bezpath(bezpath: &BezPath, t: f64, euclidian: bool, segments_l } } -pub fn sample_points_on_bezpath(bezpath: BezPath, spacing: f64, start_offset: f64, stop_offset: f64, adaptive_spacing: bool, segments_length: &[f64]) -> Option { +pub fn sample_polyline_on_bezpath( + bezpath: BezPath, + point_spacing_type: PointSpacingType, + amount: f64, + start_offset: f64, + stop_offset: f64, + adaptive_spacing: bool, + segments_length: &[f64], +) -> Option { let mut sample_bezpath = BezPath::new(); let was_closed = matches!(bezpath.elements().last(), Some(PathEl::ClosePath)); @@ -78,22 +86,33 @@ pub fn sample_points_on_bezpath(bezpath: BezPath, spacing: f64, start_offset: f6 // Adjust the usable length by subtracting start and stop offsets. let mut used_length = total_length - start_offset - stop_offset; + // Sanity check that the usable length is positive. if used_length <= 0. { return None; } - // Determine the number of points to generate along the path. - let sample_count = if adaptive_spacing { - // Calculate point count to evenly distribute points while covering the entire path. - // With adaptive spacing, we widen or narrow the points as necessary to ensure the last point is always at the end of the path. - (used_length / spacing).round() - } else { - // Calculate point count based on exact spacing, which may not cover the entire path. + const SAFETY_MAX_COUNT: f64 = 10_000. - 1.; - // Without adaptive spacing, we just evenly space the points at the exact specified spacing, usually falling short before the end of the path. - let count = (used_length / spacing + f64::EPSILON).floor(); - used_length -= used_length % spacing; - count + // Determine the number of points to generate along the path. + let sample_count = match point_spacing_type { + PointSpacingType::Separation => { + let spacing = amount.min(used_length - f64::EPSILON); + + if adaptive_spacing { + // Calculate point count to evenly distribute points while covering the entire path. + // With adaptive spacing, we widen or narrow the points as necessary to ensure the last point is always at the end of the path. + (used_length / spacing).round().min(SAFETY_MAX_COUNT) + } else { + // Calculate point count based on exact spacing, which may not cover the entire path. + // Without adaptive spacing, we just evenly space the points at the exact specified spacing, usually falling short before the end of the path. + let count = (used_length / spacing + f64::EPSILON).floor().min(SAFETY_MAX_COUNT); + if count != SAFETY_MAX_COUNT { + used_length -= used_length % spacing; + } + count + } + } + PointSpacingType::Quantity => (amount - 1.).floor().clamp(1., SAFETY_MAX_COUNT), }; // Skip if there are no points to generate. diff --git a/node-graph/gcore/src/vector/misc.rs b/node-graph/gcore/src/vector/misc.rs index cd012746e8..f29286b605 100644 --- a/node-graph/gcore/src/vector/misc.rs +++ b/node-graph/gcore/src/vector/misc.rs @@ -103,6 +103,17 @@ pub enum MergeByDistanceAlgorithm { Topological, } +#[repr(C)] +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, serde::Serialize, serde::Deserialize, Hash, DynAny, specta::Type, node_macro::ChoiceType)] +#[widget(Radio)] +pub enum PointSpacingType { + #[default] + /// The desired spacing distance between points. + Separation, + /// The exact number of points to span the path. + Quantity, +} + pub fn point_to_dvec2(point: Point) -> DVec2 { DVec2 { x: point.x, y: point.y } } diff --git a/node-graph/gcore/src/vector/vector_nodes.rs b/node-graph/gcore/src/vector/vector_nodes.rs index d2867fe27a..b6eabc1929 100644 --- a/node-graph/gcore/src/vector/vector_nodes.rs +++ b/node-graph/gcore/src/vector/vector_nodes.rs @@ -1,4 +1,4 @@ -use super::algorithms::bezpath_algorithms::{self, position_on_bezpath, sample_points_on_bezpath, split_bezpath, tangent_on_bezpath}; +use super::algorithms::bezpath_algorithms::{self, position_on_bezpath, sample_polyline_on_bezpath, split_bezpath, tangent_on_bezpath}; use super::algorithms::offset_subpath::offset_subpath; use super::algorithms::spline::{solve_spline_first_handle_closed, solve_spline_first_handle_open}; use super::misc::{CentroidType, point_to_dvec2}; @@ -9,7 +9,7 @@ use crate::raster_types::{CPU, GPU, RasterDataTable}; use crate::registry::types::{Angle, Fraction, IntegerCount, Length, Multiplier, Percentage, PixelLength, PixelSize, SeedValue}; use crate::renderer::GraphicElementRendered; use crate::transform::{Footprint, ReferencePoint, Transform}; -use crate::vector::misc::{MergeByDistanceAlgorithm, dvec2_to_point}; +use crate::vector::misc::{MergeByDistanceAlgorithm, PointSpacingType, dvec2_to_point}; use crate::vector::style::{PaintOrder, StrokeAlign, StrokeCap, StrokeJoin}; use crate::vector::{FillId, PointDomain, RegionId}; use crate::{CloneVarArgs, Color, Context, Ctx, ExtractAll, GraphicElement, GraphicGroupTable, OwnedContextImpl}; @@ -1141,11 +1141,19 @@ where output_table } +/// Convert vector geometry into a polyline composed of evenly spaced points. #[node_macro::node(category(""), path(graphene_core::vector))] -async fn sample_points(_: impl Ctx, vector_data: VectorDataTable, spacing: f64, start_offset: f64, stop_offset: f64, adaptive_spacing: bool, subpath_segment_lengths: Vec) -> VectorDataTable { - // Limit the smallest spacing to something sensible to avoid freezing the application. - let spacing = spacing.max(0.01); - +async fn sample_polyline( + _: impl Ctx, + vector_data: VectorDataTable, + spacing: PointSpacingType, + separation: f64, + quantity: f64, + start_offset: f64, + stop_offset: f64, + adaptive_spacing: bool, + subpath_segment_lengths: Vec, +) -> VectorDataTable { let mut result_table = VectorDataTable::default(); for mut vector_data_instance in vector_data.instance_iter() { @@ -1180,7 +1188,11 @@ async fn sample_points(_: impl Ctx, vector_data: VectorDataTable, spacing: f64, // Increment the segment index by the number of segments in the current bezpath to calculate the next bezpath segment's length. next_segment_index += segment_count; - let Some(mut sample_bezpath) = sample_points_on_bezpath(bezpath, spacing, start_offset, stop_offset, adaptive_spacing, current_bezpath_segments_length) else { + let amount = match spacing { + PointSpacingType::Separation => separation, + PointSpacingType::Quantity => quantity, + }; + let Some(mut sample_bezpath) = sample_polyline_on_bezpath(bezpath, spacing, amount, start_offset, stop_offset, adaptive_spacing, current_bezpath_segments_length) else { continue; }; @@ -2073,41 +2085,41 @@ mod test { } } #[tokio::test] - async fn sample_points() { + async fn sample_polyline() { let path = Subpath::from_bezier(&Bezier::from_cubic_dvec2(DVec2::ZERO, DVec2::ZERO, DVec2::X * 100., DVec2::X * 100.)); - let sample_points = super::sample_points(Footprint::default(), vector_node(path), 30., 0., 0., false, vec![100.]).await; - let sample_points = sample_points.instance_ref_iter().next().unwrap().instance; - assert_eq!(sample_points.point_domain.positions().len(), 4); - for (pos, expected) in sample_points.point_domain.positions().iter().zip([DVec2::X * 0., DVec2::X * 30., DVec2::X * 60., DVec2::X * 90.]) { + let sample_polyline = super::sample_polyline(Footprint::default(), vector_node(path), PointSpacingType::Separation, 30., 0., 0., 0., false, vec![100.]).await; + let sample_polyline = sample_polyline.instance_ref_iter().next().unwrap().instance; + assert_eq!(sample_polyline.point_domain.positions().len(), 4); + for (pos, expected) in sample_polyline.point_domain.positions().iter().zip([DVec2::X * 0., DVec2::X * 30., DVec2::X * 60., DVec2::X * 90.]) { assert!(pos.distance(expected) < 1e-3, "Expected {expected} found {pos}"); } } #[tokio::test] - async fn adaptive_spacing() { + async fn sample_polyline_adaptive_spacing() { let path = Subpath::from_bezier(&Bezier::from_cubic_dvec2(DVec2::ZERO, DVec2::ZERO, DVec2::X * 100., DVec2::X * 100.)); - let sample_points = super::sample_points(Footprint::default(), vector_node(path), 18., 45., 10., true, vec![100.]).await; - let sample_points = sample_points.instance_ref_iter().next().unwrap().instance; - assert_eq!(sample_points.point_domain.positions().len(), 4); - for (pos, expected) in sample_points.point_domain.positions().iter().zip([DVec2::X * 45., DVec2::X * 60., DVec2::X * 75., DVec2::X * 90.]) { + let sample_polyline = super::sample_polyline(Footprint::default(), vector_node(path), PointSpacingType::Separation, 18., 0., 45., 10., true, vec![100.]).await; + let sample_polyline = sample_polyline.instance_ref_iter().next().unwrap().instance; + assert_eq!(sample_polyline.point_domain.positions().len(), 4); + for (pos, expected) in sample_polyline.point_domain.positions().iter().zip([DVec2::X * 45., DVec2::X * 60., DVec2::X * 75., DVec2::X * 90.]) { assert!(pos.distance(expected) < 1e-3, "Expected {expected} found {pos}"); } } #[tokio::test] async fn poisson() { - let sample_points = super::poisson_disk_points( + let poisson_points = super::poisson_disk_points( Footprint::default(), vector_node(Subpath::new_ellipse(DVec2::NEG_ONE * 50., DVec2::ONE * 50.)), 10. * std::f64::consts::SQRT_2, 0, ) .await; - let sample_points = sample_points.instance_ref_iter().next().unwrap().instance; + let poisson_points = poisson_points.instance_ref_iter().next().unwrap().instance; assert!( - (20..=40).contains(&sample_points.point_domain.positions().len()), + (20..=40).contains(&poisson_points.point_domain.positions().len()), "actual len {}", - sample_points.point_domain.positions().len() + poisson_points.point_domain.positions().len() ); - for point in sample_points.point_domain.positions() { + for point in poisson_points.point_domain.positions() { assert!(point.length() < 50. + 1., "Expected point in circle {point}") } } @@ -2126,8 +2138,8 @@ mod test { let length = super::path_length(Footprint::default(), vector_node_from_instances(instances)).await; - // 4040 equals 101 * 4 (rectangle perimeter) * 2 (scale) * 5 (number of rows) - assert_eq!(length, 4040.); + // 101 (each rectangle edge length) * 4 (rectangle perimeter) * 2 (scale) * 5 (number of rows) + assert_eq!(length, 101. * 4. * 2. * 5.); } #[tokio::test] async fn spline() { @@ -2140,10 +2152,10 @@ mod test { async fn morph() { let source = Subpath::new_rect(DVec2::ZERO, DVec2::ONE * 100.); let target = Subpath::new_ellipse(DVec2::NEG_ONE * 100., DVec2::ZERO); - let sample_points = super::morph(Footprint::default(), vector_node(source), vector_node(target), 0.5).await; - let sample_points = sample_points.instance_ref_iter().next().unwrap().instance; + let morphed = super::morph(Footprint::default(), vector_node(source), vector_node(target), 0.5).await; + let morphed = morphed.instance_ref_iter().next().unwrap().instance; assert_eq!( - &sample_points.point_domain.positions()[..4], + &morphed.point_domain.positions()[..4], vec![DVec2::new(-25., -50.), DVec2::new(50., -25.), DVec2::new(25., 50.), DVec2::new(-50., 25.)] ); } diff --git a/node-graph/graph-craft/src/document/value.rs b/node-graph/graph-craft/src/document/value.rs index 17e1869f86..b45ff25082 100644 --- a/node-graph/graph-craft/src/document/value.rs +++ b/node-graph/graph-craft/src/document/value.rs @@ -235,6 +235,7 @@ tagged_value! { GridType(graphene_core::vector::misc::GridType), ArcType(graphene_core::vector::misc::ArcType), MergeByDistanceAlgorithm(graphene_core::vector::misc::MergeByDistanceAlgorithm), + PointSpacingType(graphene_core::vector::misc::PointSpacingType), #[serde(alias = "LineCap")] StrokeCap(graphene_core::vector::style::StrokeCap), #[serde(alias = "LineJoin")] diff --git a/node-graph/interpreted-executor/src/node_registry.rs b/node-graph/interpreted-executor/src/node_registry.rs index 2c232e1835..3f151c95b9 100644 --- a/node-graph/interpreted-executor/src/node_registry.rs +++ b/node-graph/interpreted-executor/src/node_registry.rs @@ -70,6 +70,7 @@ fn node_registry() -> HashMap, input: Context, fn_params: [Context => Color]), async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => Box]), async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => graphene_std::vector::misc::CentroidType]), + async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => graphene_std::vector::misc::PointSpacingType]), async_node!(graphene_core::memo::MemoNode<_, _>, input: Context, fn_params: [Context => Image]), async_node!(graphene_core::memo::MemoNode<_, _>, input: Context, fn_params: [Context => VectorDataTable]), async_node!(graphene_core::memo::MemoNode<_, _>, input: Context, fn_params: [Context => RasterDataTable]), From 02afd08c800ad823c64b4b159eecbd15cb6b9838 Mon Sep 17 00:00:00 2001 From: Keavon Chambers Date: Thu, 26 Jun 2025 00:19:49 -0700 Subject: [PATCH 20/44] Fix 'Scatter Points' node double transformation of points and remove segments connecting the points --- .../document/node_graph/document_node_definitions.rs | 10 +++++----- .../messages/portfolio/portfolio_message_handler.rs | 2 -- node-graph/gcore/src/graphic_element.rs | 7 ++++++- node-graph/gcore/src/vector/vector_nodes.rs | 12 ++---------- 4 files changed, 13 insertions(+), 18 deletions(-) diff --git a/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs b/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs index 729334dc52..d0be226889 100644 --- a/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs +++ b/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs @@ -316,7 +316,7 @@ fn static_nodes() -> Vec { DocumentNodeMetadata { persistent_metadata: DocumentNodePersistentMetadata { display_name: "Layer".to_string(), - node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(1, -3)), + node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(0, -3)), ..Default::default() }, ..Default::default() @@ -333,7 +333,7 @@ fn static_nodes() -> Vec { ..Default::default() }, }, - description: Cow::Borrowed("The Merge node combines graphical data through composition."), + description: Cow::Borrowed("Merge attaches a layer to the stack's group."), properties: None, }, DocumentNodeDefinition { @@ -429,7 +429,7 @@ fn static_nodes() -> Vec { DocumentNodeMetadata { persistent_metadata: DocumentNodePersistentMetadata { display_name: "To Artboard".to_string(), - node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(-10, -3)), + node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(-14, -3)), ..Default::default() }, ..Default::default() @@ -437,7 +437,7 @@ fn static_nodes() -> Vec { DocumentNodeMetadata { persistent_metadata: DocumentNodePersistentMetadata { display_name: "Monitor".to_string(), - node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(-2, -3)), + node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(-7, -3)), ..Default::default() }, ..Default::default() @@ -445,7 +445,7 @@ fn static_nodes() -> Vec { DocumentNodeMetadata { persistent_metadata: DocumentNodePersistentMetadata { display_name: "Append Artboards".to_string(), - node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(6, -4)), + node_type_metadata: NodeTypePersistentMetadata::node(IVec2::new(0, -4)), ..Default::default() }, ..Default::default() diff --git a/editor/src/messages/portfolio/portfolio_message_handler.rs b/editor/src/messages/portfolio/portfolio_message_handler.rs index 0ad1a7d08e..c09fbb92a9 100644 --- a/editor/src/messages/portfolio/portfolio_message_handler.rs +++ b/editor/src/messages/portfolio/portfolio_message_handler.rs @@ -1076,7 +1076,6 @@ impl MessageHandler> for PortfolioMes } if reference == "Sample Points" && inputs_count == 5 { - // TODO: Rename to "Sample Polyline", also remove segment generation from "Scatter Points" let node_definition = resolve_document_node_type("Sample Polyline").unwrap(); let new_node_template = node_definition.default_node_template(); let document_node = new_node_template.document_node; @@ -1096,7 +1095,6 @@ impl MessageHandler> for PortfolioMes document.network_interface.set_input(&InputConnector::node(*node_id, 5), old_inputs[3].clone(), network_path); document.network_interface.set_input(&InputConnector::node(*node_id, 6), old_inputs[4].clone(), network_path); - // TODO: Rename to "Sample Polyline", also remove segment generation from "Scatter Points" document.network_interface.replace_reference_name(node_id, network_path, "Sample Polyline".to_string()); } } diff --git a/node-graph/gcore/src/graphic_element.rs b/node-graph/gcore/src/graphic_element.rs index 44fb22c1de..3ca4f43e01 100644 --- a/node-graph/gcore/src/graphic_element.rs +++ b/node-graph/gcore/src/graphic_element.rs @@ -340,7 +340,12 @@ pub fn migrate_artboard_group<'de, D: serde::Deserializer<'de>>(deserializer: D) pub type ArtboardGroupTable = Instances; #[node_macro::node(category(""))] -async fn layer(_: impl Ctx, mut stack: GraphicGroupTable, element: GraphicElement, node_path: Vec) -> GraphicGroupTable { +async fn layer( + _: impl Ctx, + #[implementations(GraphicGroupTable, VectorDataTable, RasterDataTable, RasterDataTable)] mut stack: Instances, + #[implementations(GraphicElement, VectorData, Raster, Raster)] element: I, + node_path: Vec, +) -> Instances { // Get the penultimate element of the node path, or None if the path is too short let source_node_id = node_path.get(node_path.len().wrapping_sub(2)).copied(); diff --git a/node-graph/gcore/src/vector/vector_nodes.rs b/node-graph/gcore/src/vector/vector_nodes.rs index b6eabc1929..857f7e8ec3 100644 --- a/node-graph/gcore/src/vector/vector_nodes.rs +++ b/node-graph/gcore/src/vector/vector_nodes.rs @@ -9,7 +9,7 @@ use crate::raster_types::{CPU, GPU, RasterDataTable}; use crate::registry::types::{Angle, Fraction, IntegerCount, Length, Multiplier, Percentage, PixelLength, PixelSize, SeedValue}; use crate::renderer::GraphicElementRendered; use crate::transform::{Footprint, ReferencePoint, Transform}; -use crate::vector::misc::{MergeByDistanceAlgorithm, PointSpacingType, dvec2_to_point}; +use crate::vector::misc::{MergeByDistanceAlgorithm, PointSpacingType}; use crate::vector::style::{PaintOrder, StrokeAlign, StrokeCap, StrokeJoin}; use crate::vector::{FillId, PointDomain, RegionId}; use crate::{CloneVarArgs, Color, Context, Ctx, ExtractAll, GraphicElement, GraphicGroupTable, OwnedContextImpl}; @@ -1413,7 +1413,6 @@ async fn poisson_disk_points( .stroke_bezpath_iter() .map(|mut bezpath| { // TODO: apply transform to points instead of modifying the paths - bezpath.apply_affine(Affine::new(vector_data_instance.transform.to_cols_array())); bezpath.close_path(); let bbox = bezpath.bounding_box(); (bezpath, bbox) @@ -1425,16 +1424,9 @@ async fn poisson_disk_points( continue; } - let mut poisson_disk_bezpath = BezPath::new(); - for point in bezpath_algorithms::poisson_disk_points(i, &path_with_bounding_boxes, separation_disk_diameter, || rng.random::()) { - if poisson_disk_bezpath.elements().is_empty() { - poisson_disk_bezpath.move_to(dvec2_to_point(point)); - } else { - poisson_disk_bezpath.line_to(dvec2_to_point(point)); - } + result.point_domain.push(PointId::generate(), point); } - result.append_bezpath(poisson_disk_bezpath); } // Transfer the style from the input vector data to the result. From 86da69e33f49bb58e3e0b07d816c5df21e3c4095 Mon Sep 17 00:00:00 2001 From: Priyanshu Date: Thu, 26 Jun 2025 13:14:22 +0530 Subject: [PATCH 21/44] Fix 'Morph' node lerping the target paths to its end point instead of start point (#2754) * fix lerping the target paths to the point at the end of path instead of the start. * comment * append a MoveTo element first if the bezpath is empty --------- Co-authored-by: Keavon Chambers --- node-graph/gcore/src/vector/vector_nodes.rs | 29 ++++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/node-graph/gcore/src/vector/vector_nodes.rs b/node-graph/gcore/src/vector/vector_nodes.rs index 857f7e8ec3..c2c3fdbd36 100644 --- a/node-graph/gcore/src/vector/vector_nodes.rs +++ b/node-graph/gcore/src/vector/vector_nodes.rs @@ -15,7 +15,7 @@ use crate::vector::{FillId, PointDomain, RegionId}; use crate::{CloneVarArgs, Color, Context, Ctx, ExtractAll, GraphicElement, GraphicGroupTable, OwnedContextImpl}; use bezier_rs::{Join, ManipulatorGroup, Subpath}; use glam::{DAffine2, DVec2}; -use kurbo::{Affine, BezPath, DEFAULT_ACCURACY, ParamCurve, PathEl, PathSeg, Point, Shape}; +use kurbo::{Affine, BezPath, DEFAULT_ACCURACY, ParamCurve, PathEl, PathSeg, Shape}; use rand::{Rng, SeedableRng}; use std::collections::hash_map::DefaultHasher; use std::f64::consts::PI; @@ -1591,6 +1591,9 @@ async fn morph(_: impl Ctx, source: VectorDataTable, #[expose] target: VectorDat } for segment in new_segments { + if bezpath.elements().is_empty() { + bezpath.move_to(segment.start()) + } bezpath.push(segment.as_path_el()); } @@ -1666,7 +1669,10 @@ async fn morph(_: impl Ctx, source: VectorDataTable, #[expose] target: VectorDat for mut source_path in source_paths { source_path.apply_affine(Affine::new(source_transform.to_cols_array())); - let end: Point = source_path.elements().last().and_then(|element| element.end_point()).unwrap_or_default(); + // Skip if the path has no segments else get the point at the end of the path. + let Some(end) = source_path.segments().last().and_then(|element| Some(element.end())) else { + continue; + }; for element in source_path.elements_mut() { match element { @@ -1690,20 +1696,23 @@ async fn morph(_: impl Ctx, source: VectorDataTable, #[expose] target: VectorDat for mut target_path in target_paths { target_path.apply_affine(Affine::new(source_transform.to_cols_array())); - let end: Point = target_path.elements().last().and_then(|element| element.end_point()).unwrap_or_default(); + // Skip if the path has no segments else get the point at the start of the path. + let Some(start) = target_path.segments().next().and_then(|element| Some(element.start())) else { + continue; + }; for element in target_path.elements_mut() { match element { - PathEl::MoveTo(point) => *point = point.lerp(end, time), - PathEl::LineTo(point) => *point = point.lerp(end, time), + PathEl::MoveTo(point) => *point = start.lerp(*point, time), + PathEl::LineTo(point) => *point = start.lerp(*point, time), PathEl::QuadTo(point, point1) => { - *point = point.lerp(end, time); - *point1 = point1.lerp(end, time); + *point = start.lerp(*point, time); + *point1 = start.lerp(*point1, time); } PathEl::CurveTo(point, point1, point2) => { - *point = point.lerp(end, time); - *point1 = point1.lerp(end, time); - *point2 = point2.lerp(end, time); + *point = start.lerp(*point, time); + *point1 = start.lerp(*point1, time); + *point2 = start.lerp(*point2, time); } PathEl::ClosePath => {} } From a40a760f27e1c247614badd3f18f5f04198334dc Mon Sep 17 00:00:00 2001 From: Dennis Kobert Date: Fri, 27 Jun 2025 01:10:14 +0200 Subject: [PATCH 22/44] Add automatic type conversion and the node graph preprocessor (#2478) * Prototype document network level into node insertion * Implement Convert trait / node for places we can't use Into * Add isize/usize and i128/u128 implementations for Convert trait * Factor out substitutions into preprocessor crate * Simplify layer node further * Code review * Mark preprocessed networks as generated * Revert changes to layer node definition * Skip generated flag for serialization * Don't expand for tests * Code review --------- Co-authored-by: Keavon Chambers --- Cargo.lock | 19 ++ Cargo.toml | 3 +- editor/Cargo.toml | 6 +- .../node_graph/document_node_definitions.rs | 114 +----------- .../document_node_derive.rs | 94 ++++++++++ .../utility_types/network_interface.rs | 6 + editor/src/node_graph_executor/runtime.rs | 11 +- node-graph/gcore/src/ops.rs | 70 ++++++++ node-graph/graph-craft/src/document.rs | 6 +- node-graph/graphene-cli/Cargo.toml | 7 +- node-graph/graphene-cli/src/main.rs | 4 + .../interpreted-executor/src/node_registry.rs | 77 +++++++- node-graph/interpreted-executor/src/util.rs | 2 + node-graph/preprocessor/Cargo.toml | 29 ++++ node-graph/preprocessor/src/lib.rs | 164 ++++++++++++++++++ 15 files changed, 484 insertions(+), 128 deletions(-) create mode 100644 editor/src/messages/portfolio/document/node_graph/document_node_definitions/document_node_derive.rs create mode 100644 node-graph/preprocessor/Cargo.toml create mode 100644 node-graph/preprocessor/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index e98a3270c5..cc89fe8b23 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2175,6 +2175,7 @@ dependencies = [ "graphene-std", "interpreted-executor", "log", + "preprocessor", "tokio", "wgpu", "wgpu-executor", @@ -2282,6 +2283,7 @@ dependencies = [ "log", "num_enum", "once_cell", + "preprocessor", "ron", "serde", "serde_json", @@ -4475,6 +4477,23 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" +[[package]] +name = "preprocessor" +version = "0.1.0" +dependencies = [ + "base64 0.22.1", + "dyn-any", + "futures", + "glam", + "graph-craft", + "graphene-std", + "interpreted-executor", + "log", + "serde", + "serde_json", + "tokio", +] + [[package]] name = "presser" version = "0.3.1" diff --git a/Cargo.toml b/Cargo.toml index 5d3730d0a7..cb81f0d147 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ members = [ "node-graph/graphene-cli", "node-graph/interpreted-executor", "node-graph/node-macro", - "node-graph/wgpu-executor", + "node-graph/preprocessor", "libraries/dyn-any", "libraries/path-bool", "libraries/bezier-rs", @@ -34,6 +34,7 @@ resolver = "2" # Local dependencies bezier-rs = { path = "libraries/bezier-rs", features = ["dyn-any", "serde"] } dyn-any = { path = "libraries/dyn-any", features = ["derive", "glam", "reqwest", "log-bad-types", "rc"] } +preprocessor = { path = "node-graph/preprocessor"} math-parser = { path = "libraries/math-parser" } path-bool = { path = "libraries/path-bool" } graphene-application-io = { path = "node-graph/gapplication-io" } diff --git a/editor/Cargo.toml b/editor/Cargo.toml index 31e54a7a16..ffc95a9270 100644 --- a/editor/Cargo.toml +++ b/editor/Cargo.toml @@ -13,10 +13,7 @@ license = "Apache-2.0" [features] default = ["wasm"] wasm = ["wasm-bindgen", "graphene-std/wasm", "wasm-bindgen-futures"] -gpu = [ - "interpreted-executor/gpu", - "wgpu-executor", -] +gpu = ["interpreted-executor/gpu", "wgpu-executor"] tauri = ["ron", "decouple-execution"] decouple-execution = [] resvg = ["graphene-std/resvg"] @@ -29,6 +26,7 @@ graphite-proc-macros = { workspace = true } graph-craft = { workspace = true } interpreted-executor = { workspace = true } graphene-std = { workspace = true } +preprocessor = { workspace = true } # Workspace dependencies js-sys = { workspace = true } diff --git a/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs b/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs index d0be226889..ea7fefff21 100644 --- a/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs +++ b/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs @@ -1,3 +1,5 @@ +mod document_node_derive; + use super::node_properties::choice::enum_choice; use super::node_properties::{self, ParameterWidgetsInfo}; use super::utility_types::FrontendNodeType; @@ -91,7 +93,7 @@ static DOCUMENT_NODE_TYPES: once_cell::sync::Lazy> = /// Defines the "signature" or "header file"-like metadata for the document nodes, but not the implementation (which is defined in the node registry). /// The [`DocumentNode`] is the instance while these [`DocumentNodeDefinition`]s are the "classes" or "blueprints" from which the instances are built. fn static_nodes() -> Vec { - let mut custom = vec![ + let custom = vec![ // TODO: Auto-generate this from its proto node macro DocumentNodeDefinition { identifier: "Identity", @@ -241,21 +243,21 @@ fn static_nodes() -> Vec { DocumentNode { inputs: vec![NodeInput::network(generic!(T), 1)], implementation: DocumentNodeImplementation::proto("graphene_core::graphic_element::ToElementNode"), - manual_composition: Some(generic!(T)), + manual_composition: Some(concrete!(Context)), ..Default::default() }, // Primary (bottom) input type coercion DocumentNode { inputs: vec![NodeInput::network(generic!(T), 0)], implementation: DocumentNodeImplementation::proto("graphene_core::graphic_element::ToGroupNode"), - manual_composition: Some(generic!(T)), + manual_composition: Some(concrete!(Context)), ..Default::default() }, // The monitor node is used to display a thumbnail in the UI DocumentNode { inputs: vec![NodeInput::node(NodeId(0), 0)], implementation: DocumentNodeImplementation::proto("graphene_core::memo::MonitorNode"), - manual_composition: Some(generic!(T)), + manual_composition: Some(concrete!(Context)), skip_deduplication: true, ..Default::default() }, @@ -2114,109 +2116,7 @@ fn static_nodes() -> Vec { }, ]; - // Remove struct generics - for DocumentNodeDefinition { node_template, .. } in custom.iter_mut() { - let NodeTemplate { - document_node: DocumentNode { implementation, .. }, - .. - } = node_template; - if let DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier { name }) = implementation { - if let Some((new_name, _suffix)) = name.rsplit_once("<") { - *name = Cow::Owned(new_name.to_string()) - } - }; - } - let node_registry = graphene_std::registry::NODE_REGISTRY.lock().unwrap(); - 'outer: for (id, metadata) in graphene_std::registry::NODE_METADATA.lock().unwrap().iter() { - use graphene_std::registry::*; - let id = id.clone(); - - for node in custom.iter() { - let DocumentNodeDefinition { - node_template: NodeTemplate { - document_node: DocumentNode { implementation, .. }, - .. - }, - .. - } = node; - match implementation { - DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier { name }) if name == &id => continue 'outer, - _ => (), - } - } - - let NodeMetadata { - display_name, - category, - fields, - description, - properties, - } = metadata; - let Some(implementations) = &node_registry.get(&id) else { continue }; - let valid_inputs: HashSet<_> = implementations.iter().map(|(_, node_io)| node_io.call_argument.clone()).collect(); - let first_node_io = implementations.first().map(|(_, node_io)| node_io).unwrap_or(const { &NodeIOTypes::empty() }); - let mut input_type = &first_node_io.call_argument; - if valid_inputs.len() > 1 { - input_type = &const { generic!(D) }; - } - let output_type = &first_node_io.return_value; - - let inputs = fields - .iter() - .zip(first_node_io.inputs.iter()) - .enumerate() - .map(|(index, (field, node_io_ty))| { - let ty = field.default_type.as_ref().unwrap_or(node_io_ty); - let exposed = if index == 0 { *ty != fn_type_fut!(Context, ()) } else { field.exposed }; - - match field.value_source { - RegistryValueSource::None => {} - RegistryValueSource::Default(data) => return NodeInput::value(TaggedValue::from_primitive_string(data, ty).unwrap_or(TaggedValue::None), exposed), - RegistryValueSource::Scope(data) => return NodeInput::scope(Cow::Borrowed(data)), - }; - - if let Some(type_default) = TaggedValue::from_type(ty) { - return NodeInput::value(type_default, exposed); - } - NodeInput::value(TaggedValue::None, true) - }) - .collect(); - - let node = DocumentNodeDefinition { - identifier: display_name, - node_template: NodeTemplate { - document_node: DocumentNode { - inputs, - manual_composition: Some(input_type.clone()), - implementation: DocumentNodeImplementation::ProtoNode(id.clone().into()), - visible: true, - skip_deduplication: false, - ..Default::default() - }, - persistent_node_metadata: DocumentNodePersistentMetadata { - // TODO: Store information for input overrides in the node macro - input_properties: fields - .iter() - .map(|f| match f.widget_override { - RegistryWidgetOverride::None => (f.name, f.description).into(), - RegistryWidgetOverride::Hidden => PropertiesRow::with_override(f.name, f.description, WidgetOverride::Hidden), - RegistryWidgetOverride::String(str) => PropertiesRow::with_override(f.name, f.description, WidgetOverride::String(str.to_string())), - RegistryWidgetOverride::Custom(str) => PropertiesRow::with_override(f.name, f.description, WidgetOverride::Custom(str.to_string())), - }) - .collect(), - output_names: vec![output_type.to_string()], - has_primary_output: true, - locked: false, - ..Default::default() - }, - }, - category: category.unwrap_or("UNCATEGORIZED"), - description: Cow::Borrowed(description), - properties: *properties, - }; - custom.push(node); - } - custom + document_node_derive::post_process_nodes(custom) } // pub static IMAGINATE_NODE: Lazy = Lazy::new(|| DocumentNodeDefinition { diff --git a/editor/src/messages/portfolio/document/node_graph/document_node_definitions/document_node_derive.rs b/editor/src/messages/portfolio/document/node_graph/document_node_definitions/document_node_derive.rs new file mode 100644 index 0000000000..1339621dc4 --- /dev/null +++ b/editor/src/messages/portfolio/document/node_graph/document_node_definitions/document_node_derive.rs @@ -0,0 +1,94 @@ +use super::DocumentNodeDefinition; +use crate::messages::portfolio::document::utility_types::network_interface::{DocumentNodePersistentMetadata, NodeTemplate, PropertiesRow, WidgetOverride}; +use graph_craft::ProtoNodeIdentifier; +use graph_craft::document::*; +use graphene_std::registry::*; +use graphene_std::*; +use std::collections::HashSet; + +pub(super) fn post_process_nodes(mut custom: Vec) -> Vec { + // Remove struct generics + for DocumentNodeDefinition { node_template, .. } in custom.iter_mut() { + let NodeTemplate { + document_node: DocumentNode { implementation, .. }, + .. + } = node_template; + + if let DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier { name }) = implementation { + if let Some((new_name, _suffix)) = name.rsplit_once("<") { + *name = Cow::Owned(new_name.to_string()) + } + }; + } + + let node_registry = graphene_core::registry::NODE_REGISTRY.lock().unwrap(); + 'outer: for (id, metadata) in NODE_METADATA.lock().unwrap().iter() { + for node in custom.iter() { + let DocumentNodeDefinition { + node_template: NodeTemplate { + document_node: DocumentNode { implementation, .. }, + .. + }, + .. + } = node; + match implementation { + DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier { name }) if name == id => continue 'outer, + _ => (), + } + } + + let NodeMetadata { + display_name, + category, + fields, + description, + properties, + } = metadata; + + let Some(implementations) = &node_registry.get(id) else { continue }; + + let valid_inputs: HashSet<_> = implementations.iter().map(|(_, node_io)| node_io.call_argument.clone()).collect(); + let first_node_io = implementations.first().map(|(_, node_io)| node_io).unwrap_or(const { &NodeIOTypes::empty() }); + + let input_type = if valid_inputs.len() > 1 { &const { generic!(D) } } else { &first_node_io.call_argument }; + let output_type = &first_node_io.return_value; + + let inputs = preprocessor::node_inputs(fields, first_node_io); + let node = DocumentNodeDefinition { + identifier: display_name, + node_template: NodeTemplate { + document_node: DocumentNode { + inputs, + manual_composition: Some(input_type.clone()), + implementation: DocumentNodeImplementation::ProtoNode(id.clone().into()), + visible: true, + skip_deduplication: false, + ..Default::default() + }, + persistent_node_metadata: DocumentNodePersistentMetadata { + // TODO: Store information for input overrides in the node macro + input_properties: fields + .iter() + .map(|f| match f.widget_override { + RegistryWidgetOverride::None => (f.name, f.description).into(), + RegistryWidgetOverride::Hidden => PropertiesRow::with_override(f.name, f.description, WidgetOverride::Hidden), + RegistryWidgetOverride::String(str) => PropertiesRow::with_override(f.name, f.description, WidgetOverride::String(str.to_string())), + RegistryWidgetOverride::Custom(str) => PropertiesRow::with_override(f.name, f.description, WidgetOverride::Custom(str.to_string())), + }) + .collect(), + output_names: vec![output_type.to_string()], + has_primary_output: true, + locked: false, + ..Default::default() + }, + }, + category: category.unwrap_or("UNCATEGORIZED"), + description: Cow::Borrowed(description), + properties: *properties, + }; + + custom.push(node); + } + + custom +} diff --git a/editor/src/messages/portfolio/document/utility_types/network_interface.rs b/editor/src/messages/portfolio/document/utility_types/network_interface.rs index 1052300bd3..640c7e64ae 100644 --- a/editor/src/messages/portfolio/document/utility_types/network_interface.rs +++ b/editor/src/messages/portfolio/document/utility_types/network_interface.rs @@ -6515,6 +6515,12 @@ pub struct NodePersistentMetadata { position: NodePosition, } +impl NodePersistentMetadata { + pub fn new(position: NodePosition) -> Self { + Self { position } + } +} + /// A layer can either be position as Absolute or in a Stack #[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)] pub enum LayerPosition { diff --git a/editor/src/node_graph_executor/runtime.rs b/editor/src/node_graph_executor/runtime.rs index 1bd207aa13..c949e32dd0 100644 --- a/editor/src/node_graph_executor/runtime.rs +++ b/editor/src/node_graph_executor/runtime.rs @@ -45,6 +45,9 @@ pub struct NodeRuntime { /// Which node is inspected and which monitor node is used (if any) for the current execution inspect_state: Option, + /// Mapping of the fully-qualified node paths to their preprocessor substitutions. + substitutions: HashMap, + // TODO: Remove, it doesn't need to be persisted anymore /// The current renders of the thumbnails for layer nodes. thumbnail_renders: HashMap>, @@ -120,6 +123,8 @@ impl NodeRuntime { node_graph_errors: Vec::new(), monitor_nodes: Vec::new(), + substitutions: preprocessor::generate_node_substitutions(), + thumbnail_renders: Default::default(), vector_modify: Default::default(), inspect_state: None, @@ -221,11 +226,15 @@ impl NodeRuntime { } } - async fn update_network(&mut self, graph: NodeNetwork) -> Result { + async fn update_network(&mut self, mut graph: NodeNetwork) -> Result { + #[cfg(not(test))] + preprocessor::expand_network(&mut graph, &self.substitutions); + let scoped_network = wrap_network_in_scope(graph, self.editor_api.clone()); // We assume only one output assert_eq!(scoped_network.exports.len(), 1, "Graph with multiple outputs not yet handled"); + let c = Compiler {}; let proto_network = match c.compile_single(scoped_network) { Ok(network) => network, diff --git a/node-graph/gcore/src/ops.rs b/node-graph/gcore/src/ops.rs index b5a06abfc6..6b968ab242 100644 --- a/node-graph/gcore/src/ops.rs +++ b/node-graph/gcore/src/ops.rs @@ -571,6 +571,76 @@ where } } +/// The [`Convert`] trait allows for conversion between Rust primitive numeric types. +/// Because number casting is lossy, we cannot use the normal [`Into`] trait like we do for other types. +pub trait Convert: Sized { + /// Converts this type into the (usually inferred) output type. + #[must_use] + fn convert(self) -> T; +} + +/// Implements the [`Convert`] trait for conversion between the cartesian product of Rust's primitive numeric types. +macro_rules! impl_convert { + ($from:ty,$to:ty) => { + impl Convert<$to> for $from { + fn convert(self) -> $to { + self as $to + } + } + }; + ($to:ty) => { + impl_convert!(f32, $to); + impl_convert!(f64, $to); + impl_convert!(i8, $to); + impl_convert!(u8, $to); + impl_convert!(u16, $to); + impl_convert!(i16, $to); + impl_convert!(i32, $to); + impl_convert!(u32, $to); + impl_convert!(i64, $to); + impl_convert!(u64, $to); + impl_convert!(i128, $to); + impl_convert!(u128, $to); + impl_convert!(isize, $to); + impl_convert!(usize, $to); + }; +} +impl_convert!(f32); +impl_convert!(f64); +impl_convert!(i8); +impl_convert!(u8); +impl_convert!(u16); +impl_convert!(i16); +impl_convert!(i32); +impl_convert!(u32); +impl_convert!(i64); +impl_convert!(u64); +impl_convert!(i128); +impl_convert!(u128); +impl_convert!(isize); +impl_convert!(usize); + +// Convert +pub struct ConvertNode(PhantomData); +impl<_O> ConvertNode<_O> { + pub const fn new() -> Self { + Self(core::marker::PhantomData) + } +} +impl<_O> Default for ConvertNode<_O> { + fn default() -> Self { + Self::new() + } +} +impl<'input, I: 'input + Convert<_O> + Sync + Send, _O: 'input> Node<'input, I> for ConvertNode<_O> { + type Output = ::dyn_any::DynFuture<'input, _O>; + + #[inline] + fn eval(&'input self, input: I) -> Self::Output { + Box::pin(async move { input.convert() }) + } +} + #[cfg(test)] mod test { use super::*; diff --git a/node-graph/graph-craft/src/document.rs b/node-graph/graph-craft/src/document.rs index 1ff4b4e35a..85c15343df 100644 --- a/node-graph/graph-craft/src/document.rs +++ b/node-graph/graph-craft/src/document.rs @@ -683,6 +683,8 @@ pub struct NodeNetwork { #[serde(default)] #[serde(serialize_with = "graphene_core::vector::serialize_hashmap", deserialize_with = "graphene_core::vector::deserialize_hashmap")] pub scope_injections: FxHashMap, + #[serde(skip)] + pub generated: bool, } impl Hash for NodeNetwork { @@ -797,7 +799,9 @@ impl NodeNetwork { pub fn generate_node_paths(&mut self, prefix: &[NodeId]) { for (node_id, node) in &mut self.nodes { let mut new_path = prefix.to_vec(); - new_path.push(*node_id); + if !self.generated { + new_path.push(*node_id); + } if let DocumentNodeImplementation::Network(network) = &mut node.implementation { network.generate_node_paths(new_path.as_slice()); } diff --git a/node-graph/graphene-cli/Cargo.toml b/node-graph/graphene-cli/Cargo.toml index f3c30fe122..84bf96e7cd 100644 --- a/node-graph/graphene-cli/Cargo.toml +++ b/node-graph/graphene-cli/Cargo.toml @@ -12,11 +12,7 @@ wgpu = ["wgpu-executor", "gpu", "graphene-std/wgpu"] wayland = ["graphene-std/wayland"] profiling = ["wgpu-executor/profiling"] passthrough = ["wgpu-executor/passthrough"] -gpu = [ - "interpreted-executor/gpu", - "graphene-std/gpu", - "wgpu-executor", -] +gpu = ["interpreted-executor/gpu", "graphene-std/gpu", "wgpu-executor"] [dependencies] # Local dependencies @@ -24,6 +20,7 @@ graphene-core = { workspace = true } graphene-std = { workspace = true } interpreted-executor = { workspace = true } graph-craft = { workspace = true, features = ["loading"] } +preprocessor = { workspace = true } # Workspace dependencies log = { workspace = true } diff --git a/node-graph/graphene-cli/src/main.rs b/node-graph/graphene-cli/src/main.rs index aab5ab85c1..af535b7363 100644 --- a/node-graph/graphene-cli/src/main.rs +++ b/node-graph/graphene-cli/src/main.rs @@ -184,7 +184,11 @@ fn compile_graph(document_string: String, editor_api: Arc) -> Res let mut network = load_network(&document_string); fix_nodes(&mut network); + let substitutions = preprocessor::generate_node_substitutions(); + preprocessor::expand_network(&mut network, &substitutions); + let wrapped_network = wrap_network_in_scope(network.clone(), editor_api); + let compiler = Compiler {}; compiler.compile_single(wrapped_network).map_err(|x| x.into()) } diff --git a/node-graph/interpreted-executor/src/node_registry.rs b/node-graph/interpreted-executor/src/node_registry.rs index 3f151c95b9..4f45992c20 100644 --- a/node-graph/interpreted-executor/src/node_registry.rs +++ b/node-graph/interpreted-executor/src/node_registry.rs @@ -15,7 +15,7 @@ use graphene_std::GraphicElement; use graphene_std::any::{ComposeTypeErased, DowncastBothNode, DynAnyNode, IntoTypeErasedNode}; use graphene_std::application_io::{ImageTexture, SurfaceFrame}; use graphene_std::wasm_application_io::*; -use node_registry_macros::{async_node, into_node}; +use node_registry_macros::{async_node, convert_node, into_node}; use once_cell::sync::Lazy; use std::collections::HashMap; use std::sync::Arc; @@ -23,10 +23,7 @@ use wgpu_executor::{WgpuExecutor, WgpuSurface, WindowHandle}; // TODO: turn into hashmap fn node_registry() -> HashMap> { - let node_types: Vec<(ProtoNodeIdentifier, NodeConstructor, NodeIOTypes)> = vec![ - into_node!(from: f64, to: f64), - into_node!(from: u32, to: f64), - into_node!(from: u8, to: u32), + let mut node_types: Vec<(ProtoNodeIdentifier, NodeConstructor, NodeIOTypes)> = vec![ into_node!(from: VectorDataTable, to: VectorDataTable), into_node!(from: VectorDataTable, to: GraphicElement), into_node!(from: VectorDataTable, to: GraphicGroupTable), @@ -35,6 +32,7 @@ fn node_registry() -> HashMap, to: RasterDataTable), // into_node!(from: RasterDataTable, to: RasterDataTable), into_node!(from: RasterDataTable, to: GraphicElement), + into_node!(from: RasterDataTable, to: GraphicElement), into_node!(from: RasterDataTable, to: GraphicGroupTable), async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => RasterDataTable]), async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => ImageTexture]), @@ -137,6 +135,26 @@ fn node_registry() -> HashMap> = HashMap::new(); @@ -151,12 +169,14 @@ fn node_registry() -> HashMap { ( ProtoNodeIdentifier::new(concat!["graphene_core::ops::IntoNode<", stringify!($to), ">"]), - |mut args| { + |_| { Box::pin(async move { - args.reverse(); let node = graphene_core::ops::IntoNode::<$to>::new(); let any: DynAnyNode<$from, _, _> = graphene_std::any::DynAnyNode::new(node); Box::new(any) as TypeErasedBox @@ -220,7 +239,47 @@ mod node_registry_macros { ) }; } + macro_rules! convert_node { + (from: $from:ty, to: numbers) => {{ + let x: Vec<(ProtoNodeIdentifier, NodeConstructor, NodeIOTypes)> = vec![ + convert_node!(from: $from, to: f32), + convert_node!(from: $from, to: f64), + convert_node!(from: $from, to: i8), + convert_node!(from: $from, to: u8), + convert_node!(from: $from, to: u16), + convert_node!(from: $from, to: i16), + convert_node!(from: $from, to: i32), + convert_node!(from: $from, to: u32), + convert_node!(from: $from, to: i64), + convert_node!(from: $from, to: u64), + convert_node!(from: $from, to: i128), + convert_node!(from: $from, to: u128), + convert_node!(from: $from, to: isize), + convert_node!(from: $from, to: usize), + ]; + x + }}; + (from: $from:ty, to: $to:ty) => { + ( + ProtoNodeIdentifier::new(concat!["graphene_core::ops::ConvertNode<", stringify!($to), ">"]), + |_| { + Box::pin(async move { + let node = graphene_core::ops::ConvertNode::<$to>::new(); + let any: DynAnyNode<$from, _, _> = graphene_std::any::DynAnyNode::new(node); + Box::new(any) as TypeErasedBox + }) + }, + { + let node = graphene_core::ops::ConvertNode::<$to>::new(); + let mut node_io = NodeIO::<'_, $from>::to_async_node_io(&node, vec![]); + node_io.call_argument = future!(<$from as StaticType>::Static); + node_io + }, + ) + }; + } pub(crate) use async_node; + pub(crate) use convert_node; pub(crate) use into_node; } diff --git a/node-graph/interpreted-executor/src/util.rs b/node-graph/interpreted-executor/src/util.rs index 5d4e624a49..ab4c744e36 100644 --- a/node-graph/interpreted-executor/src/util.rs +++ b/node-graph/interpreted-executor/src/util.rs @@ -78,5 +78,7 @@ pub fn wrap_network_in_scope(mut network: NodeNetwork, editor_api: Arc) { + if network.generated { + return; + } + + for node in network.nodes.values_mut() { + match &mut node.implementation { + DocumentNodeImplementation::Network(node_network) => expand_network(node_network, substitutions), + DocumentNodeImplementation::ProtoNode(proto_node_identifier) => { + if let Some(new_node) = substitutions.get(proto_node_identifier.name.as_ref()) { + node.implementation = new_node.implementation.clone(); + } + } + DocumentNodeImplementation::Extract => (), + } + } +} + +pub fn generate_node_substitutions() -> HashMap { + let mut custom = HashMap::new(); + let node_registry = graphene_core::registry::NODE_REGISTRY.lock().unwrap(); + for (id, metadata) in graphene_core::registry::NODE_METADATA.lock().unwrap().iter() { + let id = id.clone(); + + let NodeMetadata { fields, .. } = metadata; + let Some(implementations) = &node_registry.get(&id) else { continue }; + let valid_inputs: HashSet<_> = implementations.iter().map(|(_, node_io)| node_io.call_argument.clone()).collect(); + let first_node_io = implementations.first().map(|(_, node_io)| node_io).unwrap_or(const { &NodeIOTypes::empty() }); + let mut node_io_types = vec![HashSet::new(); fields.len()]; + for (_, node_io) in implementations.iter() { + for (i, ty) in node_io.inputs.iter().enumerate() { + node_io_types[i].insert(ty.clone()); + } + } + let mut input_type = &first_node_io.call_argument; + if valid_inputs.len() > 1 { + input_type = &const { generic!(D) }; + } + + let inputs: Vec<_> = node_inputs(fields, first_node_io); + let input_count = inputs.len(); + let network_inputs = (0..input_count).map(|i| NodeInput::node(NodeId(i as u64), 0)).collect(); + + let identity_node = ProtoNodeIdentifier::new("graphene_core::ops::IdentityNode"); + + let into_node_registry = &interpreted_executor::node_registry::NODE_REGISTRY; + + let mut generated_nodes = 0; + let mut nodes: HashMap<_, _, _> = node_io_types + .iter() + .enumerate() + .map(|(i, inputs)| { + ( + NodeId(i as u64), + match inputs.len() { + 1 => { + let input = inputs.iter().next().unwrap(); + let input_ty = input.nested_type(); + + let into_node_identifier = ProtoNodeIdentifier { + name: format!("graphene_core::ops::IntoNode<{}>", input_ty.clone()).into(), + }; + let convert_node_identifier = ProtoNodeIdentifier { + name: format!("graphene_core::ops::ConvertNode<{}>", input_ty.clone()).into(), + }; + + let proto_node = if into_node_registry.keys().any(|ident: &ProtoNodeIdentifier| ident.name.as_ref() == into_node_identifier.name.as_ref()) { + generated_nodes += 1; + into_node_identifier + } else if into_node_registry.keys().any(|ident| ident.name.as_ref() == convert_node_identifier.name.as_ref()) { + generated_nodes += 1; + convert_node_identifier + } else { + identity_node.clone() + }; + + DocumentNode { + inputs: vec![NodeInput::network(input.clone(), i)], + // manual_composition: Some(fn_input.clone()), + implementation: DocumentNodeImplementation::ProtoNode(proto_node), + visible: true, + ..Default::default() + } + } + _ => DocumentNode { + inputs: vec![NodeInput::network(generic!(X), i)], + implementation: DocumentNodeImplementation::ProtoNode(identity_node.clone()), + visible: false, + ..Default::default() + }, + }, + ) + }) + .collect(); + + if generated_nodes == 0 { + continue; + } + + let document_node = DocumentNode { + inputs: network_inputs, + manual_composition: Some(input_type.clone()), + implementation: DocumentNodeImplementation::ProtoNode(id.clone().into()), + visible: true, + skip_deduplication: false, + ..Default::default() + }; + + nodes.insert(NodeId(input_count as u64), document_node); + + let node = DocumentNode { + inputs, + manual_composition: Some(input_type.clone()), + implementation: DocumentNodeImplementation::Network(NodeNetwork { + exports: vec![NodeInput::Node { + node_id: NodeId(input_count as u64), + output_index: 0, + lambda: false, + }], + nodes, + scope_injections: Default::default(), + generated: true, + }), + visible: true, + skip_deduplication: false, + ..Default::default() + }; + + custom.insert(id.clone(), node); + } + + custom +} + +pub fn node_inputs(fields: &[registry::FieldMetadata], first_node_io: &NodeIOTypes) -> Vec { + fields + .iter() + .zip(first_node_io.inputs.iter()) + .enumerate() + .map(|(index, (field, node_io_ty))| { + let ty = field.default_type.as_ref().unwrap_or(node_io_ty); + let exposed = if index == 0 { *ty != fn_type_fut!(Context, ()) } else { field.exposed }; + + match field.value_source { + RegistryValueSource::None => {} + RegistryValueSource::Default(data) => return NodeInput::value(TaggedValue::from_primitive_string(data, ty).unwrap_or(TaggedValue::None), exposed), + RegistryValueSource::Scope(data) => return NodeInput::scope(Cow::Borrowed(data)), + }; + + if let Some(type_default) = TaggedValue::from_type(ty) { + return NodeInput::value(type_default, exposed); + } + NodeInput::value(TaggedValue::None, true) + }) + .collect() +} From 1a4d7aa23ca41d12f0b2203f7f8bf0a3baf60f5c Mon Sep 17 00:00:00 2001 From: Keavon Chambers Date: Thu, 26 Jun 2025 18:10:29 -0700 Subject: [PATCH 23/44] Refactor the document upgrading code into a separate migrations file --- .../src/messages/frontend/frontend_message.rs | 13 - .../messages/portfolio/document_migration.rs | 699 +++++++++++++++++ editor/src/messages/portfolio/mod.rs | 1 + .../portfolio/portfolio_message_handler.rs | 715 +----------------- frontend/src/messages.ts | 10 - frontend/src/state-providers/portfolio.ts | 6 - frontend/wasm/src/editor_api.rs | 223 +----- 7 files changed, 716 insertions(+), 951 deletions(-) create mode 100644 editor/src/messages/portfolio/document_migration.rs diff --git a/editor/src/messages/frontend/frontend_message.rs b/editor/src/messages/frontend/frontend_message.rs index 28e3ebdaa4..7c9b90c341 100644 --- a/editor/src/messages/frontend/frontend_message.rs +++ b/editor/src/messages/frontend/frontend_message.rs @@ -99,19 +99,6 @@ pub enum FrontendMessage { #[serde(rename = "copyText")] copy_text: String, }, - // TODO: Eventually remove this document upgrade code - TriggerUpgradeDocumentToVectorManipulationFormat { - #[serde(rename = "documentId")] - document_id: DocumentId, - #[serde(rename = "documentName")] - document_name: String, - #[serde(rename = "documentIsAutoSaved")] - document_is_auto_saved: bool, - #[serde(rename = "documentIsSaved")] - document_is_saved: bool, - #[serde(rename = "documentSerializedContent")] - document_serialized_content: String, - }, TriggerVisitLink { url: String, }, diff --git a/editor/src/messages/portfolio/document_migration.rs b/editor/src/messages/portfolio/document_migration.rs new file mode 100644 index 0000000000..4b8f8a85f7 --- /dev/null +++ b/editor/src/messages/portfolio/document_migration.rs @@ -0,0 +1,699 @@ +// TODO: Eventually remove this document upgrade code +// This file contains lots of hacky code for upgrading old documents to the new format + +use crate::messages::portfolio::document::node_graph::document_node_definitions::resolve_document_node_type; +use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier; +use crate::messages::portfolio::document::utility_types::network_interface::{InputConnector, OutputConnector}; +use crate::messages::prelude::DocumentMessageHandler; +use bezier_rs::Subpath; +use glam::IVec2; +use graph_craft::document::{DocumentNodeImplementation, NodeInput, value::TaggedValue}; +use graphene_std::text::TypesettingConfig; +use graphene_std::uuid::NodeId; +use graphene_std::vector::style::{Fill, FillType, Gradient, PaintOrder, StrokeAlign}; +use graphene_std::vector::{VectorData, VectorDataTable}; +use std::collections::HashMap; + +const TEXT_REPLACEMENTS: [(&str, &str); 2] = [ + ("graphene_core::vector::vector_nodes::SamplePointsNode", "graphene_core::vector::SamplePolylineNode"), + ("graphene_core::vector::vector_nodes::SubpathSegmentLengthsNode", "graphene_core::vector::SubpathSegmentLengthsNode"), +]; + +const REPLACEMENTS: [(&str, &str); 40] = [ + ("graphene_core::AddArtboardNode", "graphene_core::graphic_element::AppendArtboardNode"), + ("graphene_core::ConstructArtboardNode", "graphene_core::graphic_element::ToArtboardNode"), + ("graphene_core::ToGraphicElementNode", "graphene_core::graphic_element::ToElementNode"), + ("graphene_core::ToGraphicGroupNode", "graphene_core::graphic_element::ToGroupNode"), + ("graphene_core::logic::LogicAndNode", "graphene_core::ops::LogicAndNode"), + ("graphene_core::logic::LogicNotNode", "graphene_core::ops::LogicNotNode"), + ("graphene_core::logic::LogicOrNode", "graphene_core::ops::LogicOrNode"), + ("graphene_core::ops::ConstructVector2", "graphene_core::ops::CoordinateValueNode"), + ("graphene_core::ops::Vector2ValueNode", "graphene_core::ops::CoordinateValueNode"), + ("graphene_core::raster::BlackAndWhiteNode", "graphene_core::raster::adjustments::BlackAndWhiteNode"), + ("graphene_core::raster::BlendNode", "graphene_core::raster::adjustments::BlendNode"), + ("graphene_core::raster::ChannelMixerNode", "graphene_core::raster::adjustments::ChannelMixerNode"), + ("graphene_core::raster::adjustments::ColorOverlayNode", "graphene_core::raster::adjustments::ColorOverlayNode"), + ("graphene_core::raster::ExposureNode", "graphene_core::raster::adjustments::ExposureNode"), + ("graphene_core::raster::ExtractChannelNode", "graphene_core::raster::adjustments::ExtractChannelNode"), + ("graphene_core::raster::GradientMapNode", "graphene_core::raster::adjustments::GradientMapNode"), + ("graphene_core::raster::HueSaturationNode", "graphene_core::raster::adjustments::HueSaturationNode"), + ("graphene_core::vector::GenerateHandlesNode", "graphene_core::vector::AutoTangentsNode"), + ("graphene_core::vector::RemoveHandlesNode", "graphene_core::vector::AutoTangentsNode"), + ("graphene_core::raster::InvertNode", "graphene_core::raster::adjustments::InvertNode"), + ("graphene_core::raster::InvertRGBNode", "graphene_core::raster::adjustments::InvertNode"), + ("graphene_core::raster::LevelsNode", "graphene_core::raster::adjustments::LevelsNode"), + ("graphene_core::raster::LuminanceNode", "graphene_core::raster::adjustments::LuminanceNode"), + ("graphene_core::raster::ExtractOpaqueNode", "graphene_core::raster::adjustments::MakeOpaqueNode"), + ("graphene_core::raster::PosterizeNode", "graphene_core::raster::adjustments::PosterizeNode"), + ("graphene_core::raster::ThresholdNode", "graphene_core::raster::adjustments::ThresholdNode"), + ("graphene_core::raster::VibranceNode", "graphene_core::raster::adjustments::VibranceNode"), + ("graphene_core::text::TextGeneratorNode", "graphene_core::text::TextNode"), + ("graphene_core::transform::SetTransformNode", "graphene_core::transform::ReplaceTransformNode"), + ("graphene_core::vector::SplinesFromPointsNode", "graphene_core::vector::SplineNode"), + ("graphene_core::vector::generator_nodes::EllipseGenerator", "graphene_core::vector::generator_nodes::EllipseNode"), + ("graphene_core::vector::generator_nodes::LineGenerator", "graphene_core::vector::generator_nodes::LineNode"), + ("graphene_core::vector::generator_nodes::RectangleGenerator", "graphene_core::vector::generator_nodes::RectangleNode"), + ( + "graphene_core::vector::generator_nodes::RegularPolygonGenerator", + "graphene_core::vector::generator_nodes::RegularPolygonNode", + ), + ("graphene_core::vector::generator_nodes::StarGenerator", "graphene_core::vector::generator_nodes::StarNode"), + ("graphene_std::executor::BlendGpuImageNode", "graphene_std::gpu_nodes::BlendGpuImageNode"), + ("graphene_std::raster::SampleNode", "graphene_std::raster::SampleImageNode"), + ("graphene_core::transform::CullNode", "graphene_core::ops::IdentityNode"), + ("graphene_std::raster::MaskImageNode", "graphene_std::raster::MaskNode"), + ("graphene_core::vector::FlattenVectorElementsNode", "graphene_core::vector::FlattenPathNode"), +]; + +pub fn document_migration_string_preprocessing(document_serialized_content: String) -> String { + TEXT_REPLACEMENTS + .iter() + .fold(document_serialized_content, |document_serialized_content, (old, new)| document_serialized_content.replace(old, new)) +} + +pub fn document_migration_reset_node_definition(document_serialized_content: &str) -> bool { + // Upgrade a document being opened to use fresh copies of all nodes + if document_serialized_content.contains("node_output_index") { + return true; + } + + // Upgrade layer implementation from https://github.com/GraphiteEditor/Graphite/pull/1946 (see also `fn fix_nodes()` in `main.rs` of Graphene CLI) + if document_serialized_content.contains("graphene_core::ConstructLayerNode") || document_serialized_content.contains("graphene_core::AddArtboardNode") { + return true; + } + + false +} + +pub fn document_migration_upgrades(document: &mut DocumentMessageHandler, reset_node_definitions_on_open: bool) { + let mut network = document.network_interface.document_network().clone(); + network.generate_node_paths(&[]); + + // Apply string replacements to each node + let node_ids: Vec<_> = network.recursive_nodes().map(|(&id, node)| (id, node.original_location.path.clone().unwrap())).collect(); + for (node_id, path) in &node_ids { + let network_path: Vec<_> = path.iter().copied().take(path.len() - 1).collect(); + + if let Some(DocumentNodeImplementation::ProtoNode(protonode_id)) = document + .network_interface + .nested_network(&network_path) + .unwrap() + .nodes + .get(node_id) + .map(|node| node.implementation.clone()) + { + for (old, new) in REPLACEMENTS { + let node_path_without_type_args = protonode_id.name.split('<').next(); + if node_path_without_type_args == Some(old) { + document + .network_interface + .replace_implementation(node_id, &network_path, DocumentNodeImplementation::ProtoNode(new.to_string().into())); + document.network_interface.set_manual_compostion(node_id, &network_path, Some(graph_craft::Type::Generic("T".into()))); + } + } + } + } + + if reset_node_definitions_on_open { + // This can be used, if uncommented, to upgrade demo artwork with outdated document node internals from their definitions. Delete when it's no longer needed. + // Used for upgrading old internal networks for demo artwork nodes. Will reset all node internals for any opened file + for node_id in &document + .network_interface + .document_network_metadata() + .persistent_metadata + .node_metadata + .keys() + .cloned() + .collect::>() + { + if let Some(reference) = document + .network_interface + .document_network_metadata() + .persistent_metadata + .node_metadata + .get(node_id) + .and_then(|node| node.persistent_metadata.reference.as_ref()) + { + let Some(node_definition) = resolve_document_node_type(reference) else { continue }; + let default_definition_node = node_definition.default_node_template(); + document.network_interface.replace_implementation(node_id, &[], default_definition_node.document_node.implementation); + document + .network_interface + .replace_implementation_metadata(node_id, &[], default_definition_node.persistent_node_metadata); + document.network_interface.set_manual_compostion(node_id, &[], default_definition_node.document_node.manual_composition); + } + } + } + + if document + .network_interface + .document_network_metadata() + .persistent_metadata + .node_metadata + .iter() + .any(|(node_id, node)| node.persistent_metadata.reference.as_ref().is_some_and(|reference| reference == "Output") && *node_id == NodeId(0)) + { + document.network_interface.delete_nodes(vec![NodeId(0)], true, &[]); + } + + let mut network = document.network_interface.document_network().clone(); + network.generate_node_paths(&[]); + + let node_ids: Vec<_> = network.recursive_nodes().map(|(&id, node)| (id, node.original_location.path.clone().unwrap())).collect(); + + // Apply upgrades to each node + for (node_id, path) in &node_ids { + let network_path: Vec<_> = path.iter().copied().take(path.len() - 1).collect(); + let network_path = &network_path; + + let Some(node) = document.network_interface.nested_network(network_path).unwrap().nodes.get(node_id).cloned() else { + log::error!("could not get node in deserialize_document"); + continue; + }; + + // Upgrade old nodes to use `Context` instead of `()` or `Footprint` for manual composition + if node.manual_composition == Some(graph_craft::concrete!(())) || node.manual_composition == Some(graph_craft::concrete!(graphene_std::transform::Footprint)) { + document + .network_interface + .set_manual_compostion(node_id, network_path, graph_craft::concrete!(graphene_std::Context).into()); + } + + let Some(node_metadata) = document.network_interface.network_metadata(network_path).unwrap().persistent_metadata.node_metadata.get(node_id) else { + log::error!("could not get node metadata for node {node_id} in deserialize_document"); + continue; + }; + + let Some(ref reference) = node_metadata.persistent_metadata.reference.clone() else { + // TODO: Investigate if this should be an expected case, because currently it runs hundreds of times normally. + // TODO: Either delete the commented out error below if this is normal, or fix the underlying issue if this is not expected. + // log::error!("could not get reference in deserialize_document"); + continue; + }; + + let inputs_count = node.inputs.len(); + + // Upgrade Fill nodes to the format change in #1778 + if reference == "Fill" && inputs_count == 8 { + let node_definition = resolve_document_node_type(reference).unwrap(); + let document_node = node_definition.default_node_template().document_node; + document.network_interface.replace_implementation(node_id, network_path, document_node.implementation.clone()); + + let old_inputs = document.network_interface.replace_inputs(node_id, document_node.inputs.clone(), network_path); + + document.network_interface.set_input(&InputConnector::node(*node_id, 0), old_inputs[0].clone(), network_path); + + let Some(fill_type) = old_inputs[1].as_value().cloned() else { continue }; + let TaggedValue::FillType(fill_type) = fill_type else { continue }; + let Some(solid_color) = old_inputs[2].as_value().cloned() else { continue }; + let TaggedValue::OptionalColor(solid_color) = solid_color else { continue }; + let Some(gradient_type) = old_inputs[3].as_value().cloned() else { continue }; + let TaggedValue::GradientType(gradient_type) = gradient_type else { continue }; + let Some(start) = old_inputs[4].as_value().cloned() else { continue }; + let TaggedValue::DVec2(start) = start else { continue }; + let Some(end) = old_inputs[5].as_value().cloned() else { continue }; + let TaggedValue::DVec2(end) = end else { continue }; + let Some(transform) = old_inputs[6].as_value().cloned() else { continue }; + let TaggedValue::DAffine2(transform) = transform else { continue }; + let Some(positions) = old_inputs[7].as_value().cloned() else { continue }; + let TaggedValue::GradientStops(positions) = positions else { continue }; + + let fill = match (fill_type, solid_color) { + (FillType::Solid, None) => Fill::None, + (FillType::Solid, Some(color)) => Fill::Solid(color), + (FillType::Gradient, _) => Fill::Gradient(Gradient { + stops: positions, + gradient_type, + start, + end, + transform, + }), + }; + document + .network_interface + .set_input(&InputConnector::node(*node_id, 1), NodeInput::value(TaggedValue::Fill(fill.clone()), false), network_path); + match fill { + Fill::None => { + document + .network_interface + .set_input(&InputConnector::node(*node_id, 2), NodeInput::value(TaggedValue::OptionalColor(None), false), network_path); + } + Fill::Solid(color) => { + document + .network_interface + .set_input(&InputConnector::node(*node_id, 2), NodeInput::value(TaggedValue::OptionalColor(Some(color)), false), network_path); + } + Fill::Gradient(gradient) => { + document + .network_interface + .set_input(&InputConnector::node(*node_id, 3), NodeInput::value(TaggedValue::Gradient(gradient), false), network_path); + } + } + } + + // Upgrade Stroke node to reorder parameters and add "Align" and "Paint Order" (#2644) + if reference == "Stroke" && inputs_count == 8 { + let node_definition = resolve_document_node_type(reference).unwrap(); + let document_node = node_definition.default_node_template().document_node; + document.network_interface.replace_implementation(node_id, network_path, document_node.implementation.clone()); + document.network_interface.insert_input_properties_row(node_id, 8, network_path); + document.network_interface.insert_input_properties_row(node_id, 9, network_path); + + let old_inputs = document.network_interface.replace_inputs(node_id, document_node.inputs.clone(), network_path); + let align_input = NodeInput::value(TaggedValue::StrokeAlign(StrokeAlign::Center), false); + let paint_order_input = NodeInput::value(TaggedValue::PaintOrder(PaintOrder::StrokeAbove), false); + + document.network_interface.set_input(&InputConnector::node(*node_id, 0), old_inputs[0].clone(), network_path); + document.network_interface.set_input(&InputConnector::node(*node_id, 1), old_inputs[1].clone(), network_path); + document.network_interface.set_input(&InputConnector::node(*node_id, 2), old_inputs[2].clone(), network_path); + document.network_interface.set_input(&InputConnector::node(*node_id, 3), align_input, network_path); + document.network_interface.set_input(&InputConnector::node(*node_id, 4), old_inputs[5].clone(), network_path); + document.network_interface.set_input(&InputConnector::node(*node_id, 5), old_inputs[6].clone(), network_path); + document.network_interface.set_input(&InputConnector::node(*node_id, 6), old_inputs[7].clone(), network_path); + document.network_interface.set_input(&InputConnector::node(*node_id, 7), paint_order_input, network_path); + document.network_interface.set_input(&InputConnector::node(*node_id, 8), old_inputs[3].clone(), network_path); + document.network_interface.set_input(&InputConnector::node(*node_id, 9), old_inputs[4].clone(), network_path); + } + + // Rename the old "Splines from Points" node to "Spline" and upgrade it to the new "Spline" node + if reference == "Splines from Points" { + document.network_interface.set_reference(node_id, network_path, Some("Spline".to_string())); + } + + // Upgrade the old "Spline" node to the new "Spline" node + if reference == "Spline" { + // Retrieve the proto node identifier and verify it is the old "Spline" node, otherwise skip it if this is the new "Spline" node + let identifier = document + .network_interface + .implementation(node_id, network_path) + .and_then(|implementation| implementation.get_proto_node()); + if identifier.map(|identifier| &identifier.name) != Some(&"graphene_core::vector::generator_nodes::SplineNode".into()) { + continue; + } + + // Obtain the document node for the given node ID, extract the vector points, and create vector data from the list of points + let node = document.network_interface.document_node(node_id, network_path).unwrap(); + let Some(TaggedValue::VecDVec2(points)) = node.inputs.get(1).and_then(|tagged_value| tagged_value.as_value()) else { + log::error!("The old Spline node's input at index 1 is not a TaggedValue::VecDVec2"); + continue; + }; + let vector_data = VectorData::from_subpath(Subpath::from_anchors_linear(points.to_vec(), false)); + + // Retrieve the output connectors linked to the "Spline" node's output port + let spline_outputs = document + .network_interface + .outward_wires(network_path) + .unwrap() + .get(&OutputConnector::node(*node_id, 0)) + .expect("Vec of InputConnector Spline node is connected to its output port 0.") + .clone(); + + // Get the node's current position in the graph + let Some(node_position) = document.network_interface.position(node_id, network_path) else { + log::error!("Could not get position of spline node."); + continue; + }; + + // Get the "Path" node definition and fill it in with the vector data and default vector modification + let path_node_type = resolve_document_node_type("Path").expect("Path node does not exist."); + let path_node = path_node_type.node_template_input_override([ + Some(NodeInput::value(TaggedValue::VectorData(VectorDataTable::new(vector_data)), true)), + Some(NodeInput::value(TaggedValue::VectorModification(Default::default()), false)), + ]); + + // Get the "Spline" node definition and wire it up with the "Path" node as input + let spline_node_type = resolve_document_node_type("Spline").expect("Spline node does not exist."); + let spline_node = spline_node_type.node_template_input_override([Some(NodeInput::node(NodeId(1), 0))]); + + // Create a new node group with the "Path" and "Spline" nodes and generate new node IDs for them + let nodes = vec![(NodeId(1), path_node), (NodeId(0), spline_node)]; + let new_ids = nodes.iter().map(|(id, _)| (*id, NodeId::new())).collect::>(); + let new_spline_id = *new_ids.get(&NodeId(0)).unwrap(); + let new_path_id = *new_ids.get(&NodeId(1)).unwrap(); + + // Remove the old "Spline" node from the document + document.network_interface.delete_nodes(vec![*node_id], false, network_path); + + // Insert the new "Path" and "Spline" nodes into the network interface with generated IDs + document.network_interface.insert_node_group(nodes.clone(), new_ids, network_path); + + // Reposition the new "Spline" node to match the original "Spline" node's position + document.network_interface.shift_node(&new_spline_id, node_position, network_path); + + // Reposition the new "Path" node with an offset relative to the original "Spline" node's position + document.network_interface.shift_node(&new_path_id, node_position + IVec2::new(-7, 0), network_path); + + // Redirect each output connection from the old node to the new "Spline" node's output port + for input_connector in spline_outputs { + document.network_interface.set_input(&input_connector, NodeInput::node(new_spline_id, 0), network_path); + } + } + + // Upgrade Text node to include line height and character spacing, which were previously hardcoded to 1, from https://github.com/GraphiteEditor/Graphite/pull/2016 + if reference == "Text" && inputs_count != 8 { + let node_definition = resolve_document_node_type(reference).unwrap(); + let document_node = node_definition.default_node_template().document_node; + document.network_interface.replace_implementation(node_id, network_path, document_node.implementation.clone()); + + let old_inputs = document.network_interface.replace_inputs(node_id, document_node.inputs.clone(), network_path); + + document.network_interface.set_input(&InputConnector::node(*node_id, 0), old_inputs[0].clone(), network_path); + document.network_interface.set_input(&InputConnector::node(*node_id, 1), old_inputs[1].clone(), network_path); + document.network_interface.set_input(&InputConnector::node(*node_id, 2), old_inputs[2].clone(), network_path); + document.network_interface.set_input(&InputConnector::node(*node_id, 3), old_inputs[3].clone(), network_path); + document.network_interface.set_input( + &InputConnector::node(*node_id, 4), + if inputs_count == 6 { + old_inputs[4].clone() + } else { + NodeInput::value(TaggedValue::F64(TypesettingConfig::default().line_height_ratio), false) + }, + network_path, + ); + document.network_interface.set_input( + &InputConnector::node(*node_id, 5), + if inputs_count == 6 { + old_inputs[5].clone() + } else { + NodeInput::value(TaggedValue::F64(TypesettingConfig::default().character_spacing), false) + }, + network_path, + ); + document.network_interface.set_input( + &InputConnector::node(*node_id, 6), + NodeInput::value(TaggedValue::OptionalF64(TypesettingConfig::default().max_width), false), + network_path, + ); + document.network_interface.set_input( + &InputConnector::node(*node_id, 7), + NodeInput::value(TaggedValue::OptionalF64(TypesettingConfig::default().max_height), false), + network_path, + ); + } + + // Upgrade Sine, Cosine, and Tangent nodes to include a boolean input for whether the output should be in radians, which was previously the only option but is now not the default + if (reference == "Sine" || reference == "Cosine" || reference == "Tangent") && inputs_count == 1 { + let node_definition = resolve_document_node_type(reference).unwrap(); + let document_node = node_definition.default_node_template().document_node; + document.network_interface.replace_implementation(node_id, network_path, document_node.implementation.clone()); + + let old_inputs = document.network_interface.replace_inputs(node_id, document_node.inputs.clone(), network_path); + + document.network_interface.set_input(&InputConnector::node(*node_id, 0), old_inputs[0].clone(), network_path); + document + .network_interface + .set_input(&InputConnector::node(*node_id, 1), NodeInput::value(TaggedValue::Bool(true), false), network_path); + } + + // Upgrade the Modulo node to include a boolean input for whether the output should be always positive, which was previously not an option + if reference == "Modulo" && inputs_count == 2 { + let node_definition = resolve_document_node_type(reference).unwrap(); + let document_node = node_definition.default_node_template().document_node; + document.network_interface.replace_implementation(node_id, network_path, document_node.implementation.clone()); + + let old_inputs = document.network_interface.replace_inputs(node_id, document_node.inputs.clone(), network_path); + + document.network_interface.set_input(&InputConnector::node(*node_id, 0), old_inputs[0].clone(), network_path); + document.network_interface.set_input(&InputConnector::node(*node_id, 1), old_inputs[1].clone(), network_path); + document + .network_interface + .set_input(&InputConnector::node(*node_id, 2), NodeInput::value(TaggedValue::Bool(false), false), network_path); + } + + // Upgrade the Mirror node to add the `keep_original` boolean input + if reference == "Mirror" && inputs_count == 3 { + let node_definition = resolve_document_node_type(reference).unwrap(); + let document_node = node_definition.default_node_template().document_node; + document.network_interface.replace_implementation(node_id, network_path, document_node.implementation.clone()); + + let old_inputs = document.network_interface.replace_inputs(node_id, document_node.inputs.clone(), network_path); + + document.network_interface.set_input(&InputConnector::node(*node_id, 0), old_inputs[0].clone(), network_path); + document.network_interface.set_input(&InputConnector::node(*node_id, 1), old_inputs[1].clone(), network_path); + document.network_interface.set_input(&InputConnector::node(*node_id, 2), old_inputs[2].clone(), network_path); + document + .network_interface + .set_input(&InputConnector::node(*node_id, 3), NodeInput::value(TaggedValue::Bool(true), false), network_path); + } + + // Upgrade the Mirror node to add the `reference_point` input and change `offset` from `DVec2` to `f64` + if reference == "Mirror" && inputs_count == 4 { + let node_definition = resolve_document_node_type(reference).unwrap(); + let new_node_template = node_definition.default_node_template(); + let document_node = new_node_template.document_node; + document.network_interface.replace_implementation(node_id, network_path, document_node.implementation.clone()); + document + .network_interface + .replace_implementation_metadata(node_id, network_path, new_node_template.persistent_node_metadata); + + let old_inputs = document.network_interface.replace_inputs(node_id, document_node.inputs.clone(), network_path); + + let Some(&TaggedValue::DVec2(old_offset)) = old_inputs[1].as_value() else { return }; + let old_offset = if old_offset.x.abs() > old_offset.y.abs() { old_offset.x } else { old_offset.y }; + + document.network_interface.set_input(&InputConnector::node(*node_id, 0), old_inputs[0].clone(), network_path); + document.network_interface.set_input( + &InputConnector::node(*node_id, 1), + NodeInput::value(TaggedValue::ReferencePoint(graphene_std::transform::ReferencePoint::Center), false), + network_path, + ); + document + .network_interface + .set_input(&InputConnector::node(*node_id, 2), NodeInput::value(TaggedValue::F64(old_offset), false), network_path); + document.network_interface.set_input(&InputConnector::node(*node_id, 3), old_inputs[2].clone(), network_path); + document.network_interface.set_input(&InputConnector::node(*node_id, 4), old_inputs[3].clone(), network_path); + } + + // Upgrade artboard name being passed as hidden value input to "To Artboard" + if reference == "Artboard" && reset_node_definitions_on_open { + let label = document.network_interface.display_name(node_id, network_path); + document + .network_interface + .set_input(&InputConnector::node(NodeId(0), 1), NodeInput::value(TaggedValue::String(label), false), &[*node_id]); + } + + if reference == "Image" && inputs_count == 1 { + let node_definition = crate::messages::portfolio::document::node_graph::document_node_definitions::resolve_document_node_type(reference).unwrap(); + let new_image_node = node_definition.default_node_template(); + document.network_interface.replace_implementation(node_id, network_path, new_image_node.document_node.implementation); + + // Insert a new empty input for the image + document.network_interface.add_import(TaggedValue::None, false, 0, "Empty", "", &[*node_id]); + document.network_interface.set_reference(node_id, network_path, Some("Image".to_string())); + } + + if reference == "Noise Pattern" && inputs_count == 15 { + let node_definition = crate::messages::portfolio::document::node_graph::document_node_definitions::resolve_document_node_type(reference).unwrap(); + let new_noise_pattern_node = node_definition.default_node_template(); + document + .network_interface + .replace_implementation(node_id, network_path, new_noise_pattern_node.document_node.implementation); + + let old_inputs = document.network_interface.replace_inputs(node_id, new_noise_pattern_node.document_node.inputs.clone(), network_path); + + document + .network_interface + .set_input(&InputConnector::node(*node_id, 0), NodeInput::value(TaggedValue::None, false), network_path); + for (i, input) in old_inputs.iter().enumerate() { + document.network_interface.set_input(&InputConnector::node(*node_id, i + 1), input.clone(), network_path); + } + } + + if reference == "Instance on Points" && inputs_count == 2 { + let node_definition = resolve_document_node_type(reference).unwrap(); + let new_node_template = node_definition.default_node_template(); + let document_node = new_node_template.document_node; + document.network_interface.replace_implementation(node_id, network_path, document_node.implementation.clone()); + document + .network_interface + .replace_implementation_metadata(node_id, network_path, new_node_template.persistent_node_metadata); + + let old_inputs = document.network_interface.replace_inputs(node_id, document_node.inputs.clone(), network_path); + + document.network_interface.set_input(&InputConnector::node(*node_id, 0), old_inputs[0].clone(), network_path); + document.network_interface.set_input(&InputConnector::node(*node_id, 1), old_inputs[1].clone(), network_path); + } + + if reference == "Morph" && inputs_count == 4 { + let node_definition = resolve_document_node_type(reference).unwrap(); + let new_node_template = node_definition.default_node_template(); + let document_node = new_node_template.document_node; + document.network_interface.replace_implementation(node_id, network_path, document_node.implementation.clone()); + document + .network_interface + .replace_implementation_metadata(node_id, network_path, new_node_template.persistent_node_metadata); + + let old_inputs = document.network_interface.replace_inputs(node_id, document_node.inputs.clone(), network_path); + + document.network_interface.set_input(&InputConnector::node(*node_id, 0), old_inputs[0].clone(), network_path); + document.network_interface.set_input(&InputConnector::node(*node_id, 1), old_inputs[1].clone(), network_path); + document.network_interface.set_input(&InputConnector::node(*node_id, 2), old_inputs[2].clone(), network_path); + // We have removed the last input, so we don't add index 3 + } + + if reference == "Brush" && inputs_count == 4 { + let node_definition = resolve_document_node_type(reference).unwrap(); + let new_node_template = node_definition.default_node_template(); + let document_node = new_node_template.document_node; + document.network_interface.replace_implementation(node_id, network_path, document_node.implementation.clone()); + document + .network_interface + .replace_implementation_metadata(node_id, network_path, new_node_template.persistent_node_metadata); + + let old_inputs = document.network_interface.replace_inputs(node_id, document_node.inputs.clone(), network_path); + + document.network_interface.set_input(&InputConnector::node(*node_id, 0), old_inputs[0].clone(), network_path); + // We have removed the second input ("bounds"), so we don't add index 1 and we shift the rest of the inputs down by one + document.network_interface.set_input(&InputConnector::node(*node_id, 1), old_inputs[2].clone(), network_path); + document.network_interface.set_input(&InputConnector::node(*node_id, 2), old_inputs[3].clone(), network_path); + } + + if reference == "Flatten Vector Elements" { + let node_definition = resolve_document_node_type("Flatten Path").unwrap(); + let new_node_template = node_definition.default_node_template(); + let document_node = new_node_template.document_node; + document.network_interface.replace_implementation(node_id, network_path, document_node.implementation.clone()); + document + .network_interface + .replace_implementation_metadata(node_id, network_path, new_node_template.persistent_node_metadata); + + let old_inputs = document.network_interface.replace_inputs(node_id, document_node.inputs.clone(), network_path); + + document.network_interface.set_input(&InputConnector::node(*node_id, 0), old_inputs[0].clone(), network_path); + + document.network_interface.replace_reference_name(node_id, network_path, "Flatten Path".to_string()); + } + + if reference == "Remove Handles" { + let node_definition = resolve_document_node_type("Auto-Tangents").unwrap(); + let new_node_template = node_definition.default_node_template(); + let document_node = new_node_template.document_node; + document.network_interface.replace_implementation(node_id, network_path, document_node.implementation.clone()); + document + .network_interface + .replace_implementation_metadata(node_id, network_path, new_node_template.persistent_node_metadata); + + let old_inputs = document.network_interface.replace_inputs(node_id, document_node.inputs.clone(), network_path); + + document.network_interface.set_input(&InputConnector::node(*node_id, 0), old_inputs[0].clone(), network_path); + document + .network_interface + .set_input(&InputConnector::node(*node_id, 1), NodeInput::value(TaggedValue::F64(0.), false), network_path); + document + .network_interface + .set_input(&InputConnector::node(*node_id, 2), NodeInput::value(TaggedValue::Bool(false), false), network_path); + + document.network_interface.replace_reference_name(node_id, network_path, "Auto-Tangents".to_string()); + } + + if reference == "Generate Handles" { + let node_definition = resolve_document_node_type("Auto-Tangents").unwrap(); + let new_node_template = node_definition.default_node_template(); + let document_node = new_node_template.document_node; + document.network_interface.replace_implementation(node_id, network_path, document_node.implementation.clone()); + document + .network_interface + .replace_implementation_metadata(node_id, network_path, new_node_template.persistent_node_metadata); + + let old_inputs = document.network_interface.replace_inputs(node_id, document_node.inputs.clone(), network_path); + + document.network_interface.set_input(&InputConnector::node(*node_id, 0), old_inputs[0].clone(), network_path); + document.network_interface.set_input(&InputConnector::node(*node_id, 1), old_inputs[1].clone(), network_path); + document + .network_interface + .set_input(&InputConnector::node(*node_id, 2), NodeInput::value(TaggedValue::Bool(true), false), network_path); + + document.network_interface.replace_reference_name(node_id, network_path, "Auto-Tangents".to_string()); + } + + if reference == "Merge by Distance" && inputs_count == 2 { + let node_definition = resolve_document_node_type("Merge by Distance").unwrap(); + let new_node_template = node_definition.default_node_template(); + let document_node = new_node_template.document_node; + document.network_interface.replace_implementation(node_id, network_path, document_node.implementation.clone()); + document + .network_interface + .replace_implementation_metadata(node_id, network_path, new_node_template.persistent_node_metadata); + + let old_inputs = document.network_interface.replace_inputs(node_id, document_node.inputs.clone(), network_path); + + document.network_interface.set_input(&InputConnector::node(*node_id, 0), old_inputs[0].clone(), network_path); + document.network_interface.set_input(&InputConnector::node(*node_id, 1), old_inputs[1].clone(), network_path); + document.network_interface.set_input( + &InputConnector::node(*node_id, 2), + NodeInput::value(TaggedValue::MergeByDistanceAlgorithm(graphene_std::vector::misc::MergeByDistanceAlgorithm::Topological), false), + network_path, + ); + } + + if reference == "Spatial Merge by Distance" { + let node_definition = resolve_document_node_type("Merge by Distance").unwrap(); + let new_node_template = node_definition.default_node_template(); + let document_node = new_node_template.document_node; + document.network_interface.replace_implementation(node_id, network_path, document_node.implementation.clone()); + document + .network_interface + .replace_implementation_metadata(node_id, network_path, new_node_template.persistent_node_metadata); + + let old_inputs = document.network_interface.replace_inputs(node_id, document_node.inputs.clone(), network_path); + + document.network_interface.set_input(&InputConnector::node(*node_id, 0), old_inputs[0].clone(), network_path); + document.network_interface.set_input(&InputConnector::node(*node_id, 1), old_inputs[1].clone(), network_path); + document.network_interface.set_input( + &InputConnector::node(*node_id, 2), + NodeInput::value(TaggedValue::MergeByDistanceAlgorithm(graphene_std::vector::misc::MergeByDistanceAlgorithm::Spatial), false), + network_path, + ); + + document.network_interface.replace_reference_name(node_id, network_path, "Merge by Distance".to_string()); + } + + if reference == "Sample Points" && inputs_count == 5 { + let node_definition = resolve_document_node_type("Sample Polyline").unwrap(); + let new_node_template = node_definition.default_node_template(); + let document_node = new_node_template.document_node; + document.network_interface.replace_implementation(node_id, network_path, document_node.implementation.clone()); + document + .network_interface + .replace_implementation_metadata(node_id, network_path, new_node_template.persistent_node_metadata); + + let old_inputs = document.network_interface.replace_inputs(node_id, document_node.inputs.clone(), network_path); + let new_spacing_value = NodeInput::value(TaggedValue::PointSpacingType(graphene_std::vector::misc::PointSpacingType::Separation), false); + + document.network_interface.set_input(&InputConnector::node(*node_id, 0), old_inputs[0].clone(), network_path); + document.network_interface.set_input(&InputConnector::node(*node_id, 1), new_spacing_value, network_path); + document.network_interface.set_input(&InputConnector::node(*node_id, 2), old_inputs[1].clone(), network_path); + document.network_interface.set_input(&InputConnector::node(*node_id, 3), old_inputs[1].clone(), network_path); + document.network_interface.set_input(&InputConnector::node(*node_id, 4), old_inputs[2].clone(), network_path); + document.network_interface.set_input(&InputConnector::node(*node_id, 5), old_inputs[3].clone(), network_path); + document.network_interface.set_input(&InputConnector::node(*node_id, 6), old_inputs[4].clone(), network_path); + + document.network_interface.replace_reference_name(node_id, network_path, "Sample Polyline".to_string()); + } + } + + // Ensure layers are positioned as stacks if they are upstream siblings of another layer + document.network_interface.load_structure(); + let all_layers = LayerNodeIdentifier::ROOT_PARENT.descendants(document.network_interface.document_metadata()).collect::>(); + for layer in all_layers { + let Some((downstream_node, input_index)) = document + .network_interface + .outward_wires(&[]) + .and_then(|outward_wires| outward_wires.get(&OutputConnector::node(layer.to_node(), 0))) + .and_then(|outward_wires| outward_wires.first()) + .and_then(|input_connector| input_connector.node_id().map(|node_id| (node_id, input_connector.input_index()))) + else { + continue; + }; + // If the downstream node is a layer and the input is the first input and the current layer is not in a stack + if input_index == 0 && document.network_interface.is_layer(&downstream_node, &[]) && !document.network_interface.is_stack(&layer.to_node(), &[]) { + // Ensure the layer is horizontally aligned with the downstream layer to prevent changing the layout of old files + let (Some(layer_position), Some(downstream_position)) = (document.network_interface.position(&layer.to_node(), &[]), document.network_interface.position(&downstream_node, &[])) else { + log::error!("Could not get position for layer {:?} or downstream node {} when opening file", layer.to_node(), downstream_node); + continue; + }; + if layer_position.x == downstream_position.x { + document.network_interface.set_stack_position_calculated_offset(&layer.to_node(), &downstream_node, &[]); + } + } + } +} diff --git a/editor/src/messages/portfolio/mod.rs b/editor/src/messages/portfolio/mod.rs index 39b25404df..2203ac9403 100644 --- a/editor/src/messages/portfolio/mod.rs +++ b/editor/src/messages/portfolio/mod.rs @@ -2,6 +2,7 @@ mod portfolio_message; mod portfolio_message_handler; pub mod document; +pub mod document_migration; pub mod menu_bar; pub mod spreadsheet; pub mod utility_types; diff --git a/editor/src/messages/portfolio/portfolio_message_handler.rs b/editor/src/messages/portfolio/portfolio_message_handler.rs index c09fbb92a9..4939092b99 100644 --- a/editor/src/messages/portfolio/portfolio_message_handler.rs +++ b/editor/src/messages/portfolio/portfolio_message_handler.rs @@ -1,5 +1,5 @@ use super::document::utility_types::document_metadata::LayerNodeIdentifier; -use super::document::utility_types::network_interface::{self, InputConnector, OutputConnector}; +use super::document::utility_types::network_interface; use super::spreadsheet::SpreadsheetMessageHandler; use super::utility_types::{PanelType, PersistentData}; use crate::application::generate_uuid; @@ -11,21 +11,17 @@ use crate::messages::frontend::utility_types::FrontendDocumentDetails; use crate::messages::layout::utility_types::widget_prelude::*; use crate::messages::portfolio::document::DocumentMessageData; use crate::messages::portfolio::document::graph_operation::utility_types::TransformIn; -use crate::messages::portfolio::document::node_graph::document_node_definitions::resolve_document_node_type; use crate::messages::portfolio::document::utility_types::clipboards::{Clipboard, CopyBufferEntry, INTERNAL_CLIPBOARD_COUNT}; use crate::messages::portfolio::document::utility_types::nodes::SelectedNodes; +use crate::messages::portfolio::document_migration::*; use crate::messages::preferences::SelectionMode; use crate::messages::prelude::*; use crate::messages::tool::utility_types::{HintData, HintGroup, ToolType}; use crate::node_graph_executor::{ExportConfig, NodeGraphExecutor}; -use bezier_rs::Subpath; -use glam::{DAffine2, DVec2, IVec2}; -use graph_craft::document::value::TaggedValue; -use graph_craft::document::{DocumentNodeImplementation, NodeId, NodeInput}; +use glam::{DAffine2, DVec2}; +use graph_craft::document::NodeId; use graphene_std::renderer::Quad; -use graphene_std::text::{Font, TypesettingConfig}; -use graphene_std::vector::style::{Fill, FillType, Gradient, PaintOrder, StrokeAlign}; -use graphene_std::vector::{VectorData, VectorDataTable}; +use graphene_std::text::Font; use std::vec; pub struct PortfolioMessageData<'a> { @@ -429,30 +425,18 @@ impl MessageHandler> for PortfolioMes document_serialized_content, to_front, } => { - // TODO: Eventually remove this document upgrade code - // This big code block contains lots of hacky code for upgrading old documents to the new format - - // Upgrade a document being opened to use fresh copies of all nodes - let replace_implementations_from_definition = reset_node_definitions_on_open || document_serialized_content.contains("node_output_index"); - // Upgrade layer implementation from https://github.com/GraphiteEditor/Graphite/pull/1946 (see also `fn fix_nodes()` in `main.rs` of Graphene CLI) - let upgrade_from_before_returning_nested_click_targets = - document_serialized_content.contains("graphene_core::ConstructLayerNode") || document_serialized_content.contains("graphene_core::AddArtboardNode"); - let upgrade_vector_manipulation_format = document_serialized_content.contains("ManipulatorGroupIds") && !document_name.contains("__DO_NOT_UPGRADE__"); - let document_name = document_name.replace("__DO_NOT_UPGRADE__", ""); - - const TEXT_REPLACEMENTS: [(&str, &str); 2] = [ - ("graphene_core::vector::vector_nodes::SamplePointsNode", "graphene_core::vector::SamplePolylineNode"), - ("graphene_core::vector::vector_nodes::SubpathSegmentLengthsNode", "graphene_core::vector::SubpathSegmentLengthsNode"), - ]; - let document_serialized_content = TEXT_REPLACEMENTS - .iter() - .fold(document_serialized_content, |document_serialized_content, (old, new)| document_serialized_content.replace(old, new)); + // Upgrade the document being opened to use fresh copies of all nodes + let reset_node_definitions_on_open = reset_node_definitions_on_open || document_migration_reset_node_definition(&document_serialized_content); + // Upgrade the document being opened with string replacements on the original JSON + let document_serialized_content = document_migration_string_preprocessing(document_serialized_content); + // Deserialize the document let document = DocumentMessageHandler::deserialize_document(&document_serialized_content).map(|mut document| { document.name.clone_from(&document_name); document }); + // Display an error to the user if the document could not be opened let mut document = match document { Ok(document) => document, Err(e) => { @@ -467,683 +451,14 @@ impl MessageHandler> for PortfolioMes } }; - const REPLACEMENTS: [(&str, &str); 40] = [ - ("graphene_core::AddArtboardNode", "graphene_core::graphic_element::AppendArtboardNode"), - ("graphene_core::ConstructArtboardNode", "graphene_core::graphic_element::ToArtboardNode"), - ("graphene_core::ToGraphicElementNode", "graphene_core::graphic_element::ToElementNode"), - ("graphene_core::ToGraphicGroupNode", "graphene_core::graphic_element::ToGroupNode"), - ("graphene_core::logic::LogicAndNode", "graphene_core::ops::LogicAndNode"), - ("graphene_core::logic::LogicNotNode", "graphene_core::ops::LogicNotNode"), - ("graphene_core::logic::LogicOrNode", "graphene_core::ops::LogicOrNode"), - ("graphene_core::ops::ConstructVector2", "graphene_core::ops::CoordinateValueNode"), - ("graphene_core::ops::Vector2ValueNode", "graphene_core::ops::CoordinateValueNode"), - ("graphene_core::raster::BlackAndWhiteNode", "graphene_core::raster::adjustments::BlackAndWhiteNode"), - ("graphene_core::raster::BlendNode", "graphene_core::raster::adjustments::BlendNode"), - ("graphene_core::raster::ChannelMixerNode", "graphene_core::raster::adjustments::ChannelMixerNode"), - ("graphene_core::raster::adjustments::ColorOverlayNode", "graphene_core::raster::adjustments::ColorOverlayNode"), - ("graphene_core::raster::ExposureNode", "graphene_core::raster::adjustments::ExposureNode"), - ("graphene_core::raster::ExtractChannelNode", "graphene_core::raster::adjustments::ExtractChannelNode"), - ("graphene_core::raster::GradientMapNode", "graphene_core::raster::adjustments::GradientMapNode"), - ("graphene_core::raster::HueSaturationNode", "graphene_core::raster::adjustments::HueSaturationNode"), - ("graphene_core::vector::GenerateHandlesNode", "graphene_core::vector::AutoTangentsNode"), - ("graphene_core::vector::RemoveHandlesNode", "graphene_core::vector::AutoTangentsNode"), - ("graphene_core::raster::InvertNode", "graphene_core::raster::adjustments::InvertNode"), - ("graphene_core::raster::InvertRGBNode", "graphene_core::raster::adjustments::InvertNode"), - ("graphene_core::raster::LevelsNode", "graphene_core::raster::adjustments::LevelsNode"), - ("graphene_core::raster::LuminanceNode", "graphene_core::raster::adjustments::LuminanceNode"), - ("graphene_core::raster::ExtractOpaqueNode", "graphene_core::raster::adjustments::MakeOpaqueNode"), - ("graphene_core::raster::PosterizeNode", "graphene_core::raster::adjustments::PosterizeNode"), - ("graphene_core::raster::ThresholdNode", "graphene_core::raster::adjustments::ThresholdNode"), - ("graphene_core::raster::VibranceNode", "graphene_core::raster::adjustments::VibranceNode"), - ("graphene_core::text::TextGeneratorNode", "graphene_core::text::TextNode"), - ("graphene_core::transform::SetTransformNode", "graphene_core::transform::ReplaceTransformNode"), - ("graphene_core::vector::SplinesFromPointsNode", "graphene_core::vector::SplineNode"), - ("graphene_core::vector::generator_nodes::EllipseGenerator", "graphene_core::vector::generator_nodes::EllipseNode"), - ("graphene_core::vector::generator_nodes::LineGenerator", "graphene_core::vector::generator_nodes::LineNode"), - ("graphene_core::vector::generator_nodes::RectangleGenerator", "graphene_core::vector::generator_nodes::RectangleNode"), - ( - "graphene_core::vector::generator_nodes::RegularPolygonGenerator", - "graphene_core::vector::generator_nodes::RegularPolygonNode", - ), - ("graphene_core::vector::generator_nodes::StarGenerator", "graphene_core::vector::generator_nodes::StarNode"), - ("graphene_std::executor::BlendGpuImageNode", "graphene_std::gpu_nodes::BlendGpuImageNode"), - ("graphene_std::raster::SampleNode", "graphene_std::raster::SampleImageNode"), - ("graphene_core::transform::CullNode", "graphene_core::ops::IdentityNode"), - ("graphene_std::raster::MaskImageNode", "graphene_std::raster::MaskNode"), - ("graphene_core::vector::FlattenVectorElementsNode", "graphene_core::vector::FlattenPathNode"), - ]; - let mut network = document.network_interface.document_network().clone(); - network.generate_node_paths(&[]); - - let node_ids: Vec<_> = network.recursive_nodes().map(|(&id, node)| (id, node.original_location.path.clone().unwrap())).collect(); - - // Apply upgrades to each node - for (node_id, path) in &node_ids { - let network_path: Vec<_> = path.iter().copied().take(path.len() - 1).collect(); - - if let Some(DocumentNodeImplementation::ProtoNode(protonode_id)) = document - .network_interface - .nested_network(&network_path) - .unwrap() - .nodes - .get(node_id) - .map(|node| node.implementation.clone()) - { - for (old, new) in REPLACEMENTS { - let node_path_without_type_args = protonode_id.name.split('<').next(); - if node_path_without_type_args == Some(old) { - document - .network_interface - .replace_implementation(node_id, &network_path, DocumentNodeImplementation::ProtoNode(new.to_string().into())); - document.network_interface.set_manual_compostion(node_id, &network_path, Some(graph_craft::Type::Generic("T".into()))); - } - } - } - } - - // Upgrade all old nodes to support editable subgraphs introduced in #1750 - if replace_implementations_from_definition || upgrade_from_before_returning_nested_click_targets { - // This can be used, if uncommented, to upgrade demo artwork with outdated document node internals from their definitions. Delete when it's no longer needed. - // Used for upgrading old internal networks for demo artwork nodes. Will reset all node internals for any opened file - for node_id in &document - .network_interface - .document_network_metadata() - .persistent_metadata - .node_metadata - .keys() - .cloned() - .collect::>() - { - if let Some(reference) = document - .network_interface - .document_network_metadata() - .persistent_metadata - .node_metadata - .get(node_id) - .and_then(|node| node.persistent_metadata.reference.as_ref()) - { - let Some(node_definition) = resolve_document_node_type(reference) else { continue }; - let default_definition_node = node_definition.default_node_template(); - document.network_interface.replace_implementation(node_id, &[], default_definition_node.document_node.implementation); - document - .network_interface - .replace_implementation_metadata(node_id, &[], default_definition_node.persistent_node_metadata); - document.network_interface.set_manual_compostion(node_id, &[], default_definition_node.document_node.manual_composition); - } - } - } - - if document - .network_interface - .document_network_metadata() - .persistent_metadata - .node_metadata - .iter() - .any(|(node_id, node)| node.persistent_metadata.reference.as_ref().is_some_and(|reference| reference == "Output") && *node_id == NodeId(0)) - { - document.network_interface.delete_nodes(vec![NodeId(0)], true, &[]); - } - - let mut network = document.network_interface.document_network().clone(); - network.generate_node_paths(&[]); - - let node_ids: Vec<_> = network.recursive_nodes().map(|(&id, node)| (id, node.original_location.path.clone().unwrap())).collect(); - - // Apply upgrades to each node - for (node_id, path) in &node_ids { - let network_path: Vec<_> = path.iter().copied().take(path.len() - 1).collect(); - let network_path = &network_path; - - let Some(node) = document.network_interface.nested_network(network_path).unwrap().nodes.get(node_id).cloned() else { - log::error!("could not get node in deserialize_document"); - continue; - }; - - // Upgrade old nodes to use `Context` instead of `()` or `Footprint` for manual composition - if node.manual_composition == Some(graph_craft::concrete!(())) || node.manual_composition == Some(graph_craft::concrete!(graphene_std::transform::Footprint)) { - document - .network_interface - .set_manual_compostion(node_id, network_path, graph_craft::concrete!(graphene_std::Context).into()); - } - - let Some(node_metadata) = document.network_interface.network_metadata(network_path).unwrap().persistent_metadata.node_metadata.get(node_id) else { - log::error!("could not get node metadata for node {node_id} in deserialize_document"); - continue; - }; - - let Some(ref reference) = node_metadata.persistent_metadata.reference.clone() else { - // TODO: Investigate if this should be an expected case, because currently it runs hundreds of times normally. - // TODO: Either delete the commented out error below if this is normal, or fix the underlying issue if this is not expected. - // log::error!("could not get reference in deserialize_document"); - continue; - }; - - let inputs_count = node.inputs.len(); - - // Upgrade Fill nodes to the format change in #1778 - if reference == "Fill" && inputs_count == 8 { - let node_definition = resolve_document_node_type(reference).unwrap(); - let document_node = node_definition.default_node_template().document_node; - document.network_interface.replace_implementation(node_id, network_path, document_node.implementation.clone()); - - let old_inputs = document.network_interface.replace_inputs(node_id, document_node.inputs.clone(), network_path); - - document.network_interface.set_input(&InputConnector::node(*node_id, 0), old_inputs[0].clone(), network_path); - - let Some(fill_type) = old_inputs[1].as_value().cloned() else { continue }; - let TaggedValue::FillType(fill_type) = fill_type else { continue }; - let Some(solid_color) = old_inputs[2].as_value().cloned() else { continue }; - let TaggedValue::OptionalColor(solid_color) = solid_color else { continue }; - let Some(gradient_type) = old_inputs[3].as_value().cloned() else { continue }; - let TaggedValue::GradientType(gradient_type) = gradient_type else { continue }; - let Some(start) = old_inputs[4].as_value().cloned() else { continue }; - let TaggedValue::DVec2(start) = start else { continue }; - let Some(end) = old_inputs[5].as_value().cloned() else { continue }; - let TaggedValue::DVec2(end) = end else { continue }; - let Some(transform) = old_inputs[6].as_value().cloned() else { continue }; - let TaggedValue::DAffine2(transform) = transform else { continue }; - let Some(positions) = old_inputs[7].as_value().cloned() else { continue }; - let TaggedValue::GradientStops(positions) = positions else { continue }; - - let fill = match (fill_type, solid_color) { - (FillType::Solid, None) => Fill::None, - (FillType::Solid, Some(color)) => Fill::Solid(color), - (FillType::Gradient, _) => Fill::Gradient(Gradient { - stops: positions, - gradient_type, - start, - end, - transform, - }), - }; - document - .network_interface - .set_input(&InputConnector::node(*node_id, 1), NodeInput::value(TaggedValue::Fill(fill.clone()), false), network_path); - match fill { - Fill::None => { - document - .network_interface - .set_input(&InputConnector::node(*node_id, 2), NodeInput::value(TaggedValue::OptionalColor(None), false), network_path); - } - Fill::Solid(color) => { - document - .network_interface - .set_input(&InputConnector::node(*node_id, 2), NodeInput::value(TaggedValue::OptionalColor(Some(color)), false), network_path); - } - Fill::Gradient(gradient) => { - document - .network_interface - .set_input(&InputConnector::node(*node_id, 3), NodeInput::value(TaggedValue::Gradient(gradient), false), network_path); - } - } - } - - // Upgrade Stroke node to reorder parameters and add "Align" and "Paint Order" (#2644) - if reference == "Stroke" && inputs_count == 8 { - let node_definition = resolve_document_node_type(reference).unwrap(); - let document_node = node_definition.default_node_template().document_node; - document.network_interface.replace_implementation(node_id, network_path, document_node.implementation.clone()); - document.network_interface.insert_input_properties_row(node_id, 8, network_path); - document.network_interface.insert_input_properties_row(node_id, 9, network_path); - - let old_inputs = document.network_interface.replace_inputs(node_id, document_node.inputs.clone(), network_path); - let align_input = NodeInput::value(TaggedValue::StrokeAlign(StrokeAlign::Center), false); - let paint_order_input = NodeInput::value(TaggedValue::PaintOrder(PaintOrder::StrokeAbove), false); - - document.network_interface.set_input(&InputConnector::node(*node_id, 0), old_inputs[0].clone(), network_path); - document.network_interface.set_input(&InputConnector::node(*node_id, 1), old_inputs[1].clone(), network_path); - document.network_interface.set_input(&InputConnector::node(*node_id, 2), old_inputs[2].clone(), network_path); - document.network_interface.set_input(&InputConnector::node(*node_id, 3), align_input, network_path); - document.network_interface.set_input(&InputConnector::node(*node_id, 4), old_inputs[5].clone(), network_path); - document.network_interface.set_input(&InputConnector::node(*node_id, 5), old_inputs[6].clone(), network_path); - document.network_interface.set_input(&InputConnector::node(*node_id, 6), old_inputs[7].clone(), network_path); - document.network_interface.set_input(&InputConnector::node(*node_id, 7), paint_order_input, network_path); - document.network_interface.set_input(&InputConnector::node(*node_id, 8), old_inputs[3].clone(), network_path); - document.network_interface.set_input(&InputConnector::node(*node_id, 9), old_inputs[4].clone(), network_path); - } - - // Rename the old "Splines from Points" node to "Spline" and upgrade it to the new "Spline" node - if reference == "Splines from Points" { - document.network_interface.set_reference(node_id, network_path, Some("Spline".to_string())); - } - - // Upgrade the old "Spline" node to the new "Spline" node - if reference == "Spline" { - // Retrieve the proto node identifier and verify it is the old "Spline" node, otherwise skip it if this is the new "Spline" node - let identifier = document - .network_interface - .implementation(node_id, network_path) - .and_then(|implementation| implementation.get_proto_node()); - if identifier.map(|identifier| &identifier.name) != Some(&"graphene_core::vector::generator_nodes::SplineNode".into()) { - continue; - } - - // Obtain the document node for the given node ID, extract the vector points, and create vector data from the list of points - let node = document.network_interface.document_node(node_id, network_path).unwrap(); - let Some(TaggedValue::VecDVec2(points)) = node.inputs.get(1).and_then(|tagged_value| tagged_value.as_value()) else { - log::error!("The old Spline node's input at index 1 is not a TaggedValue::VecDVec2"); - continue; - }; - let vector_data = VectorData::from_subpath(Subpath::from_anchors_linear(points.to_vec(), false)); - - // Retrieve the output connectors linked to the "Spline" node's output port - let spline_outputs = document - .network_interface - .outward_wires(network_path) - .unwrap() - .get(&OutputConnector::node(*node_id, 0)) - .expect("Vec of InputConnector Spline node is connected to its output port 0.") - .clone(); - - // Get the node's current position in the graph - let Some(node_position) = document.network_interface.position(node_id, network_path) else { - log::error!("Could not get position of spline node."); - continue; - }; - - // Get the "Path" node definition and fill it in with the vector data and default vector modification - let path_node_type = resolve_document_node_type("Path").expect("Path node does not exist."); - let path_node = path_node_type.node_template_input_override([ - Some(NodeInput::value(TaggedValue::VectorData(VectorDataTable::new(vector_data)), true)), - Some(NodeInput::value(TaggedValue::VectorModification(Default::default()), false)), - ]); - - // Get the "Spline" node definition and wire it up with the "Path" node as input - let spline_node_type = resolve_document_node_type("Spline").expect("Spline node does not exist."); - let spline_node = spline_node_type.node_template_input_override([Some(NodeInput::node(NodeId(1), 0))]); - - // Create a new node group with the "Path" and "Spline" nodes and generate new node IDs for them - let nodes = vec![(NodeId(1), path_node), (NodeId(0), spline_node)]; - let new_ids = nodes.iter().map(|(id, _)| (*id, NodeId::new())).collect::>(); - let new_spline_id = *new_ids.get(&NodeId(0)).unwrap(); - let new_path_id = *new_ids.get(&NodeId(1)).unwrap(); - - // Remove the old "Spline" node from the document - document.network_interface.delete_nodes(vec![*node_id], false, network_path); - - // Insert the new "Path" and "Spline" nodes into the network interface with generated IDs - document.network_interface.insert_node_group(nodes.clone(), new_ids, network_path); - - // Reposition the new "Spline" node to match the original "Spline" node's position - document.network_interface.shift_node(&new_spline_id, node_position, network_path); - - // Reposition the new "Path" node with an offset relative to the original "Spline" node's position - document.network_interface.shift_node(&new_path_id, node_position + IVec2::new(-7, 0), network_path); - - // Redirect each output connection from the old node to the new "Spline" node's output port - for input_connector in spline_outputs { - document.network_interface.set_input(&input_connector, NodeInput::node(new_spline_id, 0), network_path); - } - } - - // Upgrade Text node to include line height and character spacing, which were previously hardcoded to 1, from https://github.com/GraphiteEditor/Graphite/pull/2016 - if reference == "Text" && inputs_count != 8 { - let node_definition = resolve_document_node_type(reference).unwrap(); - let document_node = node_definition.default_node_template().document_node; - document.network_interface.replace_implementation(node_id, network_path, document_node.implementation.clone()); - - let old_inputs = document.network_interface.replace_inputs(node_id, document_node.inputs.clone(), network_path); - - document.network_interface.set_input(&InputConnector::node(*node_id, 0), old_inputs[0].clone(), network_path); - document.network_interface.set_input(&InputConnector::node(*node_id, 1), old_inputs[1].clone(), network_path); - document.network_interface.set_input(&InputConnector::node(*node_id, 2), old_inputs[2].clone(), network_path); - document.network_interface.set_input(&InputConnector::node(*node_id, 3), old_inputs[3].clone(), network_path); - document.network_interface.set_input( - &InputConnector::node(*node_id, 4), - if inputs_count == 6 { - old_inputs[4].clone() - } else { - NodeInput::value(TaggedValue::F64(TypesettingConfig::default().line_height_ratio), false) - }, - network_path, - ); - document.network_interface.set_input( - &InputConnector::node(*node_id, 5), - if inputs_count == 6 { - old_inputs[5].clone() - } else { - NodeInput::value(TaggedValue::F64(TypesettingConfig::default().character_spacing), false) - }, - network_path, - ); - document.network_interface.set_input( - &InputConnector::node(*node_id, 6), - NodeInput::value(TaggedValue::OptionalF64(TypesettingConfig::default().max_width), false), - network_path, - ); - document.network_interface.set_input( - &InputConnector::node(*node_id, 7), - NodeInput::value(TaggedValue::OptionalF64(TypesettingConfig::default().max_height), false), - network_path, - ); - } - - // Upgrade Sine, Cosine, and Tangent nodes to include a boolean input for whether the output should be in radians, which was previously the only option but is now not the default - if (reference == "Sine" || reference == "Cosine" || reference == "Tangent") && inputs_count == 1 { - let node_definition = resolve_document_node_type(reference).unwrap(); - let document_node = node_definition.default_node_template().document_node; - document.network_interface.replace_implementation(node_id, network_path, document_node.implementation.clone()); - - let old_inputs = document.network_interface.replace_inputs(node_id, document_node.inputs.clone(), network_path); - - document.network_interface.set_input(&InputConnector::node(*node_id, 0), old_inputs[0].clone(), network_path); - document - .network_interface - .set_input(&InputConnector::node(*node_id, 1), NodeInput::value(TaggedValue::Bool(true), false), network_path); - } - - // Upgrade the Modulo node to include a boolean input for whether the output should be always positive, which was previously not an option - if reference == "Modulo" && inputs_count == 2 { - let node_definition = resolve_document_node_type(reference).unwrap(); - let document_node = node_definition.default_node_template().document_node; - document.network_interface.replace_implementation(node_id, network_path, document_node.implementation.clone()); - - let old_inputs = document.network_interface.replace_inputs(node_id, document_node.inputs.clone(), network_path); - - document.network_interface.set_input(&InputConnector::node(*node_id, 0), old_inputs[0].clone(), network_path); - document.network_interface.set_input(&InputConnector::node(*node_id, 1), old_inputs[1].clone(), network_path); - document - .network_interface - .set_input(&InputConnector::node(*node_id, 2), NodeInput::value(TaggedValue::Bool(false), false), network_path); - } - - // Upgrade the Mirror node to add the `keep_original` boolean input - if reference == "Mirror" && inputs_count == 3 { - let node_definition = resolve_document_node_type(reference).unwrap(); - let document_node = node_definition.default_node_template().document_node; - document.network_interface.replace_implementation(node_id, network_path, document_node.implementation.clone()); - - let old_inputs = document.network_interface.replace_inputs(node_id, document_node.inputs.clone(), network_path); - - document.network_interface.set_input(&InputConnector::node(*node_id, 0), old_inputs[0].clone(), network_path); - document.network_interface.set_input(&InputConnector::node(*node_id, 1), old_inputs[1].clone(), network_path); - document.network_interface.set_input(&InputConnector::node(*node_id, 2), old_inputs[2].clone(), network_path); - document - .network_interface - .set_input(&InputConnector::node(*node_id, 3), NodeInput::value(TaggedValue::Bool(true), false), network_path); - } - - // Upgrade the Mirror node to add the `reference_point` input and change `offset` from `DVec2` to `f64` - if reference == "Mirror" && inputs_count == 4 { - let node_definition = resolve_document_node_type(reference).unwrap(); - let new_node_template = node_definition.default_node_template(); - let document_node = new_node_template.document_node; - document.network_interface.replace_implementation(node_id, network_path, document_node.implementation.clone()); - document - .network_interface - .replace_implementation_metadata(node_id, network_path, new_node_template.persistent_node_metadata); - - let old_inputs = document.network_interface.replace_inputs(node_id, document_node.inputs.clone(), network_path); - - let Some(&TaggedValue::DVec2(old_offset)) = old_inputs[1].as_value() else { return }; - let old_offset = if old_offset.x.abs() > old_offset.y.abs() { old_offset.x } else { old_offset.y }; - - document.network_interface.set_input(&InputConnector::node(*node_id, 0), old_inputs[0].clone(), network_path); - document.network_interface.set_input( - &InputConnector::node(*node_id, 1), - NodeInput::value(TaggedValue::ReferencePoint(graphene_std::transform::ReferencePoint::Center), false), - network_path, - ); - document - .network_interface - .set_input(&InputConnector::node(*node_id, 2), NodeInput::value(TaggedValue::F64(old_offset), false), network_path); - document.network_interface.set_input(&InputConnector::node(*node_id, 3), old_inputs[2].clone(), network_path); - document.network_interface.set_input(&InputConnector::node(*node_id, 4), old_inputs[3].clone(), network_path); - } - - // Upgrade artboard name being passed as hidden value input to "To Artboard" - if reference == "Artboard" && upgrade_from_before_returning_nested_click_targets { - let label = document.network_interface.display_name(node_id, network_path); - document - .network_interface - .set_input(&InputConnector::node(NodeId(0), 1), NodeInput::value(TaggedValue::String(label), false), &[*node_id]); - } - - if reference == "Image" && inputs_count == 1 { - let node_definition = crate::messages::portfolio::document::node_graph::document_node_definitions::resolve_document_node_type(reference).unwrap(); - let new_image_node = node_definition.default_node_template(); - document.network_interface.replace_implementation(node_id, network_path, new_image_node.document_node.implementation); - - // Insert a new empty input for the image - document.network_interface.add_import(TaggedValue::None, false, 0, "Empty", "", &[*node_id]); - document.network_interface.set_reference(node_id, network_path, Some("Image".to_string())); - } - - if reference == "Noise Pattern" && inputs_count == 15 { - let node_definition = crate::messages::portfolio::document::node_graph::document_node_definitions::resolve_document_node_type(reference).unwrap(); - let new_noise_pattern_node = node_definition.default_node_template(); - document - .network_interface - .replace_implementation(node_id, network_path, new_noise_pattern_node.document_node.implementation); - - let old_inputs = document.network_interface.replace_inputs(node_id, new_noise_pattern_node.document_node.inputs.clone(), network_path); - - document - .network_interface - .set_input(&InputConnector::node(*node_id, 0), NodeInput::value(TaggedValue::None, false), network_path); - for (i, input) in old_inputs.iter().enumerate() { - document.network_interface.set_input(&InputConnector::node(*node_id, i + 1), input.clone(), network_path); - } - } - - if reference == "Instance on Points" && inputs_count == 2 { - let node_definition = resolve_document_node_type(reference).unwrap(); - let new_node_template = node_definition.default_node_template(); - let document_node = new_node_template.document_node; - document.network_interface.replace_implementation(node_id, network_path, document_node.implementation.clone()); - document - .network_interface - .replace_implementation_metadata(node_id, network_path, new_node_template.persistent_node_metadata); - - let old_inputs = document.network_interface.replace_inputs(node_id, document_node.inputs.clone(), network_path); - - document.network_interface.set_input(&InputConnector::node(*node_id, 0), old_inputs[0].clone(), network_path); - document.network_interface.set_input(&InputConnector::node(*node_id, 1), old_inputs[1].clone(), network_path); - } - - if reference == "Morph" && inputs_count == 4 { - let node_definition = resolve_document_node_type(reference).unwrap(); - let new_node_template = node_definition.default_node_template(); - let document_node = new_node_template.document_node; - document.network_interface.replace_implementation(node_id, network_path, document_node.implementation.clone()); - document - .network_interface - .replace_implementation_metadata(node_id, network_path, new_node_template.persistent_node_metadata); - - let old_inputs = document.network_interface.replace_inputs(node_id, document_node.inputs.clone(), network_path); - - document.network_interface.set_input(&InputConnector::node(*node_id, 0), old_inputs[0].clone(), network_path); - document.network_interface.set_input(&InputConnector::node(*node_id, 1), old_inputs[1].clone(), network_path); - document.network_interface.set_input(&InputConnector::node(*node_id, 2), old_inputs[2].clone(), network_path); - // We have removed the last input, so we don't add index 3 - } - - if reference == "Brush" && inputs_count == 4 { - let node_definition = resolve_document_node_type(reference).unwrap(); - let new_node_template = node_definition.default_node_template(); - let document_node = new_node_template.document_node; - document.network_interface.replace_implementation(node_id, network_path, document_node.implementation.clone()); - document - .network_interface - .replace_implementation_metadata(node_id, network_path, new_node_template.persistent_node_metadata); - - let old_inputs = document.network_interface.replace_inputs(node_id, document_node.inputs.clone(), network_path); - - document.network_interface.set_input(&InputConnector::node(*node_id, 0), old_inputs[0].clone(), network_path); - // We have removed the second input ("bounds"), so we don't add index 1 and we shift the rest of the inputs down by one - document.network_interface.set_input(&InputConnector::node(*node_id, 1), old_inputs[2].clone(), network_path); - document.network_interface.set_input(&InputConnector::node(*node_id, 2), old_inputs[3].clone(), network_path); - } - - if reference == "Flatten Vector Elements" { - let node_definition = resolve_document_node_type("Flatten Path").unwrap(); - let new_node_template = node_definition.default_node_template(); - let document_node = new_node_template.document_node; - document.network_interface.replace_implementation(node_id, network_path, document_node.implementation.clone()); - document - .network_interface - .replace_implementation_metadata(node_id, network_path, new_node_template.persistent_node_metadata); - - let old_inputs = document.network_interface.replace_inputs(node_id, document_node.inputs.clone(), network_path); - - document.network_interface.set_input(&InputConnector::node(*node_id, 0), old_inputs[0].clone(), network_path); - - document.network_interface.replace_reference_name(node_id, network_path, "Flatten Path".to_string()); - } - - if reference == "Remove Handles" { - let node_definition = resolve_document_node_type("Auto-Tangents").unwrap(); - let new_node_template = node_definition.default_node_template(); - let document_node = new_node_template.document_node; - document.network_interface.replace_implementation(node_id, network_path, document_node.implementation.clone()); - document - .network_interface - .replace_implementation_metadata(node_id, network_path, new_node_template.persistent_node_metadata); - - let old_inputs = document.network_interface.replace_inputs(node_id, document_node.inputs.clone(), network_path); - - document.network_interface.set_input(&InputConnector::node(*node_id, 0), old_inputs[0].clone(), network_path); - document - .network_interface - .set_input(&InputConnector::node(*node_id, 1), NodeInput::value(TaggedValue::F64(0.), false), network_path); - document - .network_interface - .set_input(&InputConnector::node(*node_id, 2), NodeInput::value(TaggedValue::Bool(false), false), network_path); - - document.network_interface.replace_reference_name(node_id, network_path, "Auto-Tangents".to_string()); - } - - if reference == "Generate Handles" { - let node_definition = resolve_document_node_type("Auto-Tangents").unwrap(); - let new_node_template = node_definition.default_node_template(); - let document_node = new_node_template.document_node; - document.network_interface.replace_implementation(node_id, network_path, document_node.implementation.clone()); - document - .network_interface - .replace_implementation_metadata(node_id, network_path, new_node_template.persistent_node_metadata); - - let old_inputs = document.network_interface.replace_inputs(node_id, document_node.inputs.clone(), network_path); - - document.network_interface.set_input(&InputConnector::node(*node_id, 0), old_inputs[0].clone(), network_path); - document.network_interface.set_input(&InputConnector::node(*node_id, 1), old_inputs[1].clone(), network_path); - document - .network_interface - .set_input(&InputConnector::node(*node_id, 2), NodeInput::value(TaggedValue::Bool(true), false), network_path); - - document.network_interface.replace_reference_name(node_id, network_path, "Auto-Tangents".to_string()); - } - - if reference == "Merge by Distance" && inputs_count == 2 { - let node_definition = resolve_document_node_type("Merge by Distance").unwrap(); - let new_node_template = node_definition.default_node_template(); - let document_node = new_node_template.document_node; - document.network_interface.replace_implementation(node_id, network_path, document_node.implementation.clone()); - document - .network_interface - .replace_implementation_metadata(node_id, network_path, new_node_template.persistent_node_metadata); - - let old_inputs = document.network_interface.replace_inputs(node_id, document_node.inputs.clone(), network_path); - - document.network_interface.set_input(&InputConnector::node(*node_id, 0), old_inputs[0].clone(), network_path); - document.network_interface.set_input(&InputConnector::node(*node_id, 1), old_inputs[1].clone(), network_path); - document.network_interface.set_input( - &InputConnector::node(*node_id, 2), - NodeInput::value(TaggedValue::MergeByDistanceAlgorithm(graphene_std::vector::misc::MergeByDistanceAlgorithm::Topological), false), - network_path, - ); - } - - if reference == "Spatial Merge by Distance" { - let node_definition = resolve_document_node_type("Merge by Distance").unwrap(); - let new_node_template = node_definition.default_node_template(); - let document_node = new_node_template.document_node; - document.network_interface.replace_implementation(node_id, network_path, document_node.implementation.clone()); - document - .network_interface - .replace_implementation_metadata(node_id, network_path, new_node_template.persistent_node_metadata); - - let old_inputs = document.network_interface.replace_inputs(node_id, document_node.inputs.clone(), network_path); - - document.network_interface.set_input(&InputConnector::node(*node_id, 0), old_inputs[0].clone(), network_path); - document.network_interface.set_input(&InputConnector::node(*node_id, 1), old_inputs[1].clone(), network_path); - document.network_interface.set_input( - &InputConnector::node(*node_id, 2), - NodeInput::value(TaggedValue::MergeByDistanceAlgorithm(graphene_std::vector::misc::MergeByDistanceAlgorithm::Spatial), false), - network_path, - ); - - document.network_interface.replace_reference_name(node_id, network_path, "Merge by Distance".to_string()); - } - - if reference == "Sample Points" && inputs_count == 5 { - let node_definition = resolve_document_node_type("Sample Polyline").unwrap(); - let new_node_template = node_definition.default_node_template(); - let document_node = new_node_template.document_node; - document.network_interface.replace_implementation(node_id, network_path, document_node.implementation.clone()); - document - .network_interface - .replace_implementation_metadata(node_id, network_path, new_node_template.persistent_node_metadata); - - let old_inputs = document.network_interface.replace_inputs(node_id, document_node.inputs.clone(), network_path); - let new_spacing_value = NodeInput::value(TaggedValue::PointSpacingType(graphene_std::vector::misc::PointSpacingType::Separation), false); - - document.network_interface.set_input(&InputConnector::node(*node_id, 0), old_inputs[0].clone(), network_path); - document.network_interface.set_input(&InputConnector::node(*node_id, 1), new_spacing_value, network_path); - document.network_interface.set_input(&InputConnector::node(*node_id, 2), old_inputs[1].clone(), network_path); - document.network_interface.set_input(&InputConnector::node(*node_id, 3), old_inputs[1].clone(), network_path); - document.network_interface.set_input(&InputConnector::node(*node_id, 4), old_inputs[2].clone(), network_path); - document.network_interface.set_input(&InputConnector::node(*node_id, 5), old_inputs[3].clone(), network_path); - document.network_interface.set_input(&InputConnector::node(*node_id, 6), old_inputs[4].clone(), network_path); - - document.network_interface.replace_reference_name(node_id, network_path, "Sample Polyline".to_string()); - } - } - - // TODO: Eventually remove this document upgrade code - // Upgrade document to the new vector manipulation format introduced in #1676 - let document_serialized_content = document.serialize_document(); - if upgrade_vector_manipulation_format && !document_serialized_content.is_empty() { - responses.add(FrontendMessage::TriggerUpgradeDocumentToVectorManipulationFormat { - document_id, - document_name, - document_is_auto_saved, - document_is_saved, - document_serialized_content, - }); - return; - } - - // Ensure layers are positioned as stacks if they upstream siblings of another layer - document.network_interface.load_structure(); - let all_layers = LayerNodeIdentifier::ROOT_PARENT.descendants(document.network_interface.document_metadata()).collect::>(); - for layer in all_layers { - let Some((downstream_node, input_index)) = document - .network_interface - .outward_wires(&[]) - .and_then(|outward_wires| outward_wires.get(&OutputConnector::node(layer.to_node(), 0))) - .and_then(|outward_wires| outward_wires.first()) - .and_then(|input_connector| input_connector.node_id().map(|node_id| (node_id, input_connector.input_index()))) - else { - continue; - }; - // If the downstream node is a layer and the input is the first input and the current layer is not in a stack - if input_index == 0 && document.network_interface.is_layer(&downstream_node, &[]) && !document.network_interface.is_stack(&layer.to_node(), &[]) { - // Ensure the layer is horizontally aligned with the downstream layer to prevent changing the layout of old files - let (Some(layer_position), Some(downstream_position)) = - (document.network_interface.position(&layer.to_node(), &[]), document.network_interface.position(&downstream_node, &[])) - else { - log::error!("Could not get position for layer {:?} or downstream node {} when opening file", layer.to_node(), downstream_node); - continue; - }; - if layer_position.x == downstream_position.x { - document.network_interface.set_stack_position_calculated_offset(&layer.to_node(), &downstream_node, &[]); - } - } - } + // Upgrade the document's nodes to be compatible with the latest version + document_migration_upgrades(&mut document, reset_node_definitions_on_open); + // Set the save state of the document based on what's given to us by the caller to this message document.set_auto_save_state(document_is_auto_saved); document.set_save_state(document_is_saved); + // Load the document into the portfolio so it opens in the editor self.load_document(document, document_id, responses, to_front); } PortfolioMessage::PasteIntoFolder { clipboard, parent, insert_index } => { diff --git a/frontend/src/messages.ts b/frontend/src/messages.ts index a2f07809e2..399beb50c5 100644 --- a/frontend/src/messages.ts +++ b/frontend/src/messages.ts @@ -940,15 +940,6 @@ export class TriggerAboutGraphiteLocalizedCommitDate extends JsMessage { readonly commitDate!: string; } -// TODO: Eventually remove this document upgrade code -export class TriggerUpgradeDocumentToVectorManipulationFormat extends JsMessage { - readonly documentId!: bigint; - readonly documentName!: string; - readonly documentIsAutoSaved!: boolean; - readonly documentIsSaved!: boolean; - readonly documentSerializedContent!: string; -} - // WIDGET PROPS export abstract class WidgetProps { @@ -1679,7 +1670,6 @@ export const messageMakers: Record = { TriggerSavePreferences, TriggerTextCommit, TriggerTextCopy, - TriggerUpgradeDocumentToVectorManipulationFormat, TriggerVisitLink, UpdateActiveDocument, UpdateBox, diff --git a/frontend/src/state-providers/portfolio.ts b/frontend/src/state-providers/portfolio.ts index 1cf63a2811..f425ba17d4 100644 --- a/frontend/src/state-providers/portfolio.ts +++ b/frontend/src/state-providers/portfolio.ts @@ -10,7 +10,6 @@ import { TriggerDownloadTextFile, TriggerImport, TriggerOpenDocument, - TriggerUpgradeDocumentToVectorManipulationFormat, UpdateActiveDocument, UpdateOpenDocumentsList, UpdateSpreadsheetState, @@ -104,11 +103,6 @@ export function createPortfolioState(editor: Editor) { // Fail silently if there's an error rasterizing the SVG, such as a zero-sized image } }); - editor.subscriptions.subscribeJsMessage(TriggerUpgradeDocumentToVectorManipulationFormat, async (triggerUpgradeDocumentToVectorManipulationFormat) => { - // TODO: Eventually remove this document upgrade code - const { documentId, documentName, documentIsAutoSaved, documentIsSaved, documentSerializedContent } = triggerUpgradeDocumentToVectorManipulationFormat; - editor.handle.triggerUpgradeDocumentToVectorManipulationFormat(documentId, documentName, documentIsAutoSaved, documentIsSaved, documentSerializedContent); - }); editor.subscriptions.subscribeJsMessage(UpdateSpreadsheetState, async (updateSpreadsheetState) => { update((state) => { diff --git a/frontend/wasm/src/editor_api.rs b/frontend/wasm/src/editor_api.rs index 88bc85bc3a..80bfd7fce7 100644 --- a/frontend/wasm/src/editor_api.rs +++ b/frontend/wasm/src/editor_api.rs @@ -11,7 +11,7 @@ use editor::consts::FILE_SAVE_SUFFIX; use editor::messages::input_mapper::utility_types::input_keyboard::ModifierKeys; use editor::messages::input_mapper::utility_types::input_mouse::{EditorMouseState, ScrollDelta, ViewportBounds}; use editor::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier; -use editor::messages::portfolio::document::utility_types::network_interface::{ImportOrExport, NodeTemplate}; +use editor::messages::portfolio::document::utility_types::network_interface::ImportOrExport; use editor::messages::portfolio::utility_types::Platform; use editor::messages::prelude::*; use editor::messages::tool::tool_messages::tool_prelude::WidgetId; @@ -734,227 +734,6 @@ impl EditorHandle { }; self.dispatch(message); } - - // #[wasm_bindgen(js_name = injectImaginatePollServerStatus)] - // pub fn inject_imaginate_poll_server_status(&self) { - // self.dispatch(PortfolioMessage::ImaginatePollServerStatus); - // } - - // TODO: Eventually remove this document upgrade code - #[wasm_bindgen(js_name = triggerUpgradeDocumentToVectorManipulationFormat)] - pub async fn upgrade_document_to_vector_manipulation_format( - &self, - document_id: u64, - document_name: String, - document_is_auto_saved: bool, - document_is_saved: bool, - document_serialized_content: String, - ) { - use editor::messages::portfolio::document::graph_operation::transform_utils::*; - use editor::messages::portfolio::document::graph_operation::utility_types::*; - use editor::messages::portfolio::document::node_graph::document_node_definitions::resolve_document_node_type; - use editor::node_graph_executor::NodeRuntime; - use editor::node_graph_executor::replace_node_runtime; - use graph_craft::document::DocumentNodeImplementation; - use graph_craft::document::NodeInput; - use graph_craft::document::value::TaggedValue; - use graphene_std::vector::*; - - let (_, request_receiver) = std::sync::mpsc::channel(); - let (response_sender, _) = std::sync::mpsc::channel(); - let old_runtime = replace_node_runtime(NodeRuntime::new(request_receiver, response_sender)).await; - - let mut editor = Editor::new(); - let document_id = DocumentId(document_id); - editor.handle_message(PortfolioMessage::OpenDocumentFileWithId { - document_id, - document_name: document_name.clone(), - document_is_auto_saved, - document_is_saved, - document_serialized_content: document_serialized_content.clone(), - to_front: false, - }); - - let Some(document) = editor.dispatcher.message_handlers.portfolio_message_handler.active_document_mut() else { - warn!("Document wasn't loaded"); - return; - }; - for node in document - .network_interface - .document_network_metadata() - .persistent_metadata - .node_metadata - .iter() - .filter(|(_, d)| d.persistent_metadata.reference.as_ref().is_some_and(|reference| reference == "Artboard")) - .map(|(id, _)| *id) - .collect::>() - { - let Some(document_node) = document.network_interface.document_network().nodes.get(&node) else { - log::error!("Could not get document node in document network"); - return; - }; - if let Some(network) = document_node.implementation.get_network() { - let mut nodes_to_upgrade = Vec::new(); - for (node_id, _) in network.nodes.iter().collect::>() { - if document - .network_interface - .reference(node_id, &[]) - .is_some_and(|reference| *reference == Some("To Artboard".to_string())) - && document - .network_interface - .document_network() - .nodes - .get(node_id) - .is_some_and(|document_node| document_node.inputs.len() != 6) - { - nodes_to_upgrade.push(*node_id); - } - } - for node_id in nodes_to_upgrade { - document - .network_interface - .replace_implementation(&node_id, &[], DocumentNodeImplementation::proto("graphene_core::ToArtboardNode")); - document.network_interface.add_import(TaggedValue::IVec2(glam::IVec2::default()), false, 2, "", "", &[node_id]); - } - } - } - - let portfolio = &mut editor.dispatcher.message_handlers.portfolio_message_handler; - portfolio - .executor - .submit_node_graph_evaluation( - portfolio.documents.get_mut(&portfolio.active_document_id().unwrap()).unwrap(), - glam::UVec2::ONE, - Default::default(), - None, - true, - ) - .unwrap(); - editor::node_graph_executor::run_node_graph().await; - - let mut messages = VecDeque::new(); - if let Err(err) = editor.poll_node_graph_evaluation(&mut messages) { - log::warn!( - "While attempting to upgrade the old document format, the graph evaluation failed which is necessary for the upgrade process:\n{:#?}", - err - ); - - replace_node_runtime(old_runtime.unwrap()).await; - - let document_name = document_name.clone() + "__DO_NOT_UPGRADE__"; - self.dispatch(PortfolioMessage::OpenDocumentFileWithId { - document_id, - document_name, - document_is_auto_saved, - document_is_saved, - document_serialized_content, - to_front: false, - }); - return; - } - - let mut updated_nodes = HashSet::new(); - let document = editor.dispatcher.message_handlers.portfolio_message_handler.active_document_mut().unwrap(); - document.network_interface.load_structure(); - for node in document - .network_interface - .document_network_metadata() - .persistent_metadata - .node_metadata - .iter() - .filter(|(_, d)| d.persistent_metadata.reference.as_ref().is_some_and(|reference| reference == "Merge")) - .map(|(id, _)| *id) - .collect::>() - { - let layer = LayerNodeIdentifier::new(node, &document.network_interface, &[]); - if layer.has_children(document.metadata()) { - continue; - } - - let bounds = LayerBounds::new(document.metadata(), layer); - - let mut responses = VecDeque::new(); - let mut shape = None; - - if let Some(mut modify_inputs) = ModifyInputsContext::new_with_layer(layer, &mut document.network_interface, &mut responses) { - let Some(transform_node_id) = modify_inputs.existing_node_id("Transform", true) else { - return; - }; - if !updated_nodes.insert(transform_node_id) { - return; - } - let Some(inputs) = modify_inputs.network_interface.document_network().nodes.get(&transform_node_id).map(|node| &node.inputs) else { - log::error!("Could not get transform node in document network"); - return; - }; - let transform = get_current_transform(inputs); - let upstream_transform = modify_inputs.network_interface.document_metadata().upstream_transform(transform_node_id); - let pivot_transform = glam::DAffine2::from_translation(upstream_transform.transform_point2(bounds.local_pivot(get_current_normalized_pivot(inputs)))); - - update_transform(&mut document.network_interface, &transform_node_id, pivot_transform * transform * pivot_transform.inverse()); - } - if let Some(mut modify_inputs) = ModifyInputsContext::new_with_layer(layer, &mut document.network_interface, &mut responses) { - let Some(shape_node_id) = modify_inputs.existing_node_id("Shape", true) else { - return; - }; - if !updated_nodes.insert(shape_node_id) { - return; - } - let Some(shape_node) = modify_inputs.network_interface.document_network().nodes.get(&shape_node_id) else { - log::error!("Could not get shape node in document network"); - return; - }; - let path_data = match &shape_node.inputs[0].as_value() { - Some(TaggedValue::Subpaths(translation)) => translation, - _ => &Vec::new(), - }; - - let colinear_manipulators = match &shape_node.inputs[1].as_value() { - Some(TaggedValue::PointIds(translation)) => translation, - _ => &Vec::new(), - }; - - let mut vector_data = VectorData::from_subpaths(path_data, false); - vector_data.colinear_manipulators = colinear_manipulators - .iter() - .filter_map(|&point| ManipulatorPointId::Anchor(point).get_handle_pair(&vector_data)) - .collect(); - - shape = Some((shape_node_id, VectorModification::create_from_vector(&vector_data))); - } - - if let Some((node_id, modification)) = shape { - let node_type = resolve_document_node_type("Path").unwrap(); - let document_node = node_type - .node_template_input_override([None, Some(NodeInput::value(TaggedValue::VectorModification(Box::new(modification)), false))]) - .document_node; - - let node_metadata = document.network_interface.node_metadata(&node_id, &[]).cloned().unwrap_or_default(); - - document.network_interface.insert_node( - node_id, - NodeTemplate { - document_node, - persistent_node_metadata: node_metadata.persistent_metadata, - }, - &[], - ); - } - } - - let document_serialized_content = editor.dispatcher.message_handlers.portfolio_message_handler.active_document_mut().unwrap().serialize_document(); - - replace_node_runtime(old_runtime.unwrap()).await; - - self.dispatch(PortfolioMessage::OpenDocumentFileWithId { - document_id, - document_name, - document_is_auto_saved, - document_is_saved, - document_serialized_content, - to_front: false, - }); - } } // ============================================================================ From 1875779b0a94bfbc05ef59c7759c1fa253f72afd Mon Sep 17 00:00:00 2001 From: Keavon Chambers Date: Thu, 26 Jun 2025 18:33:00 -0700 Subject: [PATCH 24/44] Remove dead code for Imaginate --- editor/src/application.rs | 50 -- .../preferences_dialog_message_handler.rs | 23 - .../messages/input_mapper/input_mappings.rs | 7 - .../portfolio/document/document_message.rs | 7 - .../document/document_message_handler.rs | 31 - .../node_graph/document_node_definitions.rs | 139 ----- .../node_graph/node_graph_message_handler.rs | 7 +- .../node_graph/node_properties_imaginate.rs | 547 ------------------ .../messages/portfolio/portfolio_message.rs | 3 - .../portfolio/portfolio_message_handler.rs | 28 - .../src/messages/portfolio/utility_types.rs | 1 - .../preferences/preferences_message.rs | 2 - .../preferences_message_handler.rs | 30 - editor/src/messages/prelude.rs | 1 - editor/src/messages/tool/tool_message.rs | 11 +- .../src/messages/tool/tool_message_handler.rs | 2 - .../tool/tool_messages/imaginate_tool.rs | 184 ------ editor/src/messages/tool/tool_messages/mod.rs | 1 - editor/src/messages/tool/utility_types.rs | 6 - editor/src/node_graph_executor.rs | 3 - frontend/src/editor.ts | 12 - node-graph/gapplication-io/src/lib.rs | 9 +- .../gcore/src/graphic_element/renderer.rs | 3 +- node-graph/graph-craft/src/document/value.rs | 5 - node-graph/graph-craft/src/imaginate_input.rs | 279 --------- .../graph-craft/src/wasm_application_io.rs | 5 - node-graph/gstd/Cargo.toml | 15 +- node-graph/gstd/src/imaginate.rs | 526 ----------------- node-graph/gstd/src/raster.rs | 97 ---- website/content/features.md | 8 +- .../introduction/features-and-limitations.md | 2 - .../guide/codebase-overview/_index.md | 1 - 32 files changed, 23 insertions(+), 2022 deletions(-) delete mode 100644 editor/src/messages/portfolio/document/node_graph/node_properties_imaginate.rs delete mode 100644 editor/src/messages/tool/tool_messages/imaginate_tool.rs delete mode 100644 node-graph/graph-craft/src/imaginate_input.rs delete mode 100644 node-graph/gstd/src/imaginate.rs diff --git a/editor/src/application.rs b/editor/src/application.rs index 8c858814d9..fdb8c60334 100644 --- a/editor/src/application.rs +++ b/editor/src/application.rs @@ -55,53 +55,3 @@ pub fn commit_info_localized(localized_commit_date: &str) -> String { localized_commit_date ) } - -// #[cfg(test)] -// mod test { -// use crate::messages::input_mapper::utility_types::input_mouse::ViewportBounds; -// use crate::messages::prelude::*; - -// // TODO: Fix and reenable -// #[ignore] -// #[test] -// fn debug_ub() { -// use super::Message; - -// let mut editor = super::Editor::new(); -// let mut responses = Vec::new(); - -// let messages: Vec = vec![ -// Message::Init, -// Message::Preferences(PreferencesMessage::Load { -// preferences: r#"{ "imaginate_server_hostname": "http://localhost:7860/", "imaginate_refresh_frequency": 1, "zoom_with_scroll": false }"#.to_string(), -// }), -// PortfolioMessage::OpenDocumentFileWithId { -// document_id: DocumentId(0), -// document_name: "".into(), -// document_is_auto_saved: true, -// document_is_saved: true, -// document_serialized_content: r#" [removed until test is reenabled] "#.into(), -// to_front: false, -// } -// .into(), -// InputPreprocessorMessage::BoundsOfViewports { -// bounds_of_viewports: vec![ViewportBounds::from_slice(&[0., 0., 1920., 1080.])], -// } -// .into(), -// ]; - -// use futures::executor::block_on; -// for message in messages { -// block_on(crate::node_graph_executor::run_node_graph()); -// let mut res = VecDeque::new(); -// editor.poll_node_graph_evaluation(&mut res).expect("poll_node_graph_evaluation failed"); - -// let res = editor.handle_message(message); -// responses.push(res); -// } -// let responses = responses.pop().unwrap(); -// // let trigger_message = responses[responses.len() - 2].clone(); - -// println!("responses: {responses:#?}"); -// } -// } diff --git a/editor/src/messages/dialog/preferences_dialog/preferences_dialog_message_handler.rs b/editor/src/messages/dialog/preferences_dialog/preferences_dialog_message_handler.rs index f26a863a03..d4790a4d0e 100644 --- a/editor/src/messages/dialog/preferences_dialog/preferences_dialog_message_handler.rs +++ b/editor/src/messages/dialog/preferences_dialog/preferences_dialog_message_handler.rs @@ -204,27 +204,6 @@ impl PreferencesDialogMessageHandler { .widget_holder(), ]; - // TODO: Reenable when Imaginate is restored - // let imaginate_server_hostname = vec![ - // TextLabel::new("Imaginate").min_width(60).italic(true).widget_holder(), - // TextLabel::new("Server Hostname").table_align(true).widget_holder(), - // TextInput::new(&preferences.imaginate_server_hostname) - // .min_width(200) - // .on_update(|text_input: &TextInput| PreferencesMessage::ImaginateServerHostname { hostname: text_input.value.clone() }.into()) - // .widget_holder(), - // ]; - // let imaginate_refresh_frequency = vec![ - // TextLabel::new("").min_width(60).widget_holder(), - // TextLabel::new("Refresh Frequency").table_align(true).widget_holder(), - // NumberInput::new(Some(preferences.imaginate_refresh_frequency)) - // .unit(" seconds") - // .min(0.) - // .max((1_u64 << f64::MANTISSA_DIGITS) as f64) - // .min_width(200) - // .on_update(|number_input: &NumberInput| PreferencesMessage::ImaginateRefreshFrequency { seconds: number_input.value.unwrap() }.into()) - // .widget_holder(), - // ]; - Layout::WidgetLayout(WidgetLayout::new(vec![ LayoutGroup::Row { widgets: navigation_header }, LayoutGroup::Row { widgets: zoom_rate_label }, @@ -238,8 +217,6 @@ impl PreferencesDialogMessageHandler { LayoutGroup::Row { widgets: graph_wire_style }, LayoutGroup::Row { widgets: use_vello }, LayoutGroup::Row { widgets: vector_meshes }, - // LayoutGroup::Row { widgets: imaginate_server_hostname }, - // LayoutGroup::Row { widgets: imaginate_refresh_frequency }, ])) } diff --git a/editor/src/messages/input_mapper/input_mappings.rs b/editor/src/messages/input_mapper/input_mappings.rs index 46854dc760..c2465d00d2 100644 --- a/editor/src/messages/input_mapper/input_mappings.rs +++ b/editor/src/messages/input_mapper/input_mappings.rs @@ -206,13 +206,6 @@ pub fn input_mappings() -> Mapping { entry!(KeyDown(ArrowUp); action_dispatch=ShapeToolMessage::IncreaseSides), entry!(KeyDown(ArrowDown); action_dispatch=ShapeToolMessage::DecreaseSides), // - // ImaginateToolMessage - // entry!(KeyDown(MouseLeft); action_dispatch=ImaginateToolMessage::DragStart), - // entry!(KeyUp(MouseLeft); action_dispatch=ImaginateToolMessage::DragStop), - // entry!(KeyDown(MouseRight); action_dispatch=ImaginateToolMessage::Abort), - // entry!(KeyDown(Escape); action_dispatch=ImaginateToolMessage::Abort), - // entry!(PointerMove; refresh_keys=[Alt, Shift], action_dispatch=ImaginateToolMessage::Resize { center: Alt, lock_ratio: Shift }), - // // PathToolMessage entry!(KeyDown(Delete); modifiers=[Accel], action_dispatch=PathToolMessage::DeleteAndBreakPath), entry!(KeyDown(Backspace); modifiers=[Accel], action_dispatch=PathToolMessage::DeleteAndBreakPath), diff --git a/editor/src/messages/portfolio/document/document_message.rs b/editor/src/messages/portfolio/document/document_message.rs index 9ceec6b6c2..2a201f58fb 100644 --- a/editor/src/messages/portfolio/document/document_message.rs +++ b/editor/src/messages/portfolio/document/document_message.rs @@ -73,13 +73,6 @@ pub enum DocumentMessage { GroupSelectedLayers { group_folder_type: GroupFolderType, }, - // ImaginateGenerate { - // imaginate_node: Vec, - // }, - // ImaginateRandom { - // imaginate_node: Vec, - // then_generate: bool, - // }, MoveSelectedLayersTo { parent: LayerNodeIdentifier, insert_index: usize, diff --git a/editor/src/messages/portfolio/document/document_message_handler.rs b/editor/src/messages/portfolio/document/document_message_handler.rs index 8e7b1c39cd..0d5bd75972 100644 --- a/editor/src/messages/portfolio/document/document_message_handler.rs +++ b/editor/src/messages/portfolio/document/document_message_handler.rs @@ -613,37 +613,6 @@ impl MessageHandler> for DocumentMessag responses.add(NodeGraphMessage::SelectedNodesSet { nodes: new_folders }); } } - // DocumentMessage::ImaginateGenerate { imaginate_node } => { - // let random_value = generate_uuid(); - // responses.add(NodeGraphMessage::SetInputValue { - // node_id: *imaginate_node.last().unwrap(), - // // Needs to match the index of the seed parameter in `pub const IMAGINATE_NODE: DocumentNodeDefinition` in `document_node_type.rs` - // input_index: 17, - // value: graph_craft::document::value::TaggedValue::U64(random_value), - // }); - - // responses.add(PortfolioMessage::SubmitGraphRender { document_id, ignore_hash: false }); - // } - // DocumentMessage::ImaginateRandom { imaginate_node, then_generate } => { - // // Generate a random seed. We only want values between -2^53 and 2^53, because integer values - // // outside of this range can get rounded in f64 - // let random_bits = generate_uuid(); - // let random_value = ((random_bits >> 11) as f64).copysign(f64::from_bits(random_bits & (1 << 63))); - - // responses.add(DocumentMessage::AddTransaction); - // // Set a random seed input - // responses.add(NodeGraphMessage::SetInputValue { - // node_id: *imaginate_node.last().unwrap(), - // // Needs to match the index of the seed parameter in `pub const IMAGINATE_NODE: DocumentNodeDefinition` in `document_node_type.rs` - // input_index: 3, - // value: graph_craft::document::value::TaggedValue::F64(random_value), - // }); - - // // Generate the image - // if then_generate { - // responses.add(DocumentMessage::ImaginateGenerate { imaginate_node }); - // } - // } DocumentMessage::MoveSelectedLayersTo { parent, insert_index } => { if !self.selection_network_path.is_empty() { log::error!("Moving selected layers is only supported for the Document Network"); diff --git a/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs b/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs index ea7fefff21..f0432906eb 100644 --- a/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs +++ b/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs @@ -1466,7 +1466,6 @@ fn static_nodes() -> Vec { // description: Cow::Borrowed("TODO"), // properties: None, // }, - // (*IMAGINATE_NODE).clone(), DocumentNodeDefinition { identifier: "Path", category: "Vector", @@ -2119,128 +2118,6 @@ fn static_nodes() -> Vec { document_node_derive::post_process_nodes(custom) } -// pub static IMAGINATE_NODE: Lazy = Lazy::new(|| DocumentNodeDefinition { -// identifier: "Imaginate", -// category: "Raster", -// node_template: NodeTemplate { -// document_node: DocumentNode { -// implementation: DocumentNodeImplementation::Network(NodeNetwork { -// exports: vec![NodeInput::node(NodeId(1), 0)], -// nodes: [ -// DocumentNode { -// inputs: vec![NodeInput::network(concrete!(RasterDataTable), 0)], -// implementation: DocumentNodeImplementation::proto("graphene_core::memo::MonitorNode"), -// manual_composition: Some(concrete!(Context)), -// skip_deduplication: true, -// ..Default::default() -// }, -// DocumentNode { -// inputs: vec![ -// NodeInput::node(NodeId(0), 0), -// NodeInput::network(concrete!(&WasmEditorApi), 1), -// NodeInput::network(concrete!(ImaginateController), 2), -// NodeInput::network(concrete!(f64), 3), -// NodeInput::network(concrete!(Option), 4), -// NodeInput::network(concrete!(u32), 5), -// NodeInput::network(concrete!(ImaginateSamplingMethod), 6), -// NodeInput::network(concrete!(f64), 7), -// NodeInput::network(concrete!(String), 8), -// NodeInput::network(concrete!(String), 9), -// NodeInput::network(concrete!(bool), 10), -// NodeInput::network(concrete!(f64), 11), -// NodeInput::network(concrete!(bool), 12), -// NodeInput::network(concrete!(f64), 13), -// NodeInput::network(concrete!(ImaginateMaskStartingFill), 14), -// NodeInput::network(concrete!(bool), 15), -// NodeInput::network(concrete!(bool), 16), -// NodeInput::network(concrete!(u64), 17), -// ], -// implementation: DocumentNodeImplementation::proto("graphene_std::raster::ImaginateNode"), -// ..Default::default() -// }, -// ] -// .into_iter() -// .enumerate() -// .map(|(id, node)| (NodeId(id as u64), node)) -// .collect(), -// ..Default::default() -// }), -// inputs: vec![ -// NodeInput::value(TaggedValue::RasterData(RasterDataTable::default()), true), -// NodeInput::scope("editor-api"), -// NodeInput::value(TaggedValue::ImaginateController(Default::default()), false), -// NodeInput::value(TaggedValue::F64(0.), false), // Remember to keep index used in `ImaginateRandom` updated with this entry's index -// NodeInput::value(TaggedValue::OptionalDVec2(None), false), -// NodeInput::value(TaggedValue::U32(30), false), -// NodeInput::value(TaggedValue::ImaginateSamplingMethod(ImaginateSamplingMethod::EulerA), false), -// NodeInput::value(TaggedValue::F64(7.5), false), -// NodeInput::value(TaggedValue::String(String::new()), false), -// NodeInput::value(TaggedValue::String(String::new()), false), -// NodeInput::value(TaggedValue::Bool(false), false), -// NodeInput::value(TaggedValue::F64(66.), false), -// NodeInput::value(TaggedValue::Bool(true), false), -// NodeInput::value(TaggedValue::F64(4.), false), -// NodeInput::value(TaggedValue::ImaginateMaskStartingFill(ImaginateMaskStartingFill::Fill), false), -// NodeInput::value(TaggedValue::Bool(false), false), -// NodeInput::value(TaggedValue::Bool(false), false), -// NodeInput::value(TaggedValue::U64(0), false), -// ], -// ..Default::default() -// }, -// persistent_node_metadata: DocumentNodePersistentMetadata { -// network_metadata: Some(NodeNetworkMetadata { -// persistent_metadata: NodeNetworkPersistentMetadata { -// node_metadata: [ -// DocumentNodeMetadata { -// persistent_metadata: DocumentNodePersistentMetadata { -// display_name: "Monitor".to_string(), -// ..Default::default() -// }, -// ..Default::default() -// }, -// DocumentNodeMetadata { -// persistent_metadata: DocumentNodePersistentMetadata { -// display_name: "Imaginate".to_string(), -// ..Default::default() -// }, -// ..Default::default() -// }, -// ] -// .into_iter() -// .enumerate() -// .map(|(id, node)| (NodeId(id as u64), node)) -// .collect(), -// ..Default::default() -// }, -// ..Default::default() -// }), -// input_properties: vec![ -// "Input Image".into(), -// "Editor Api".into(), -// "Controller".into(), -// "Seed".into(), -// "Resolution".into(), -// "Samples".into(), -// "Sampling Method".into(), -// "Prompt Guidance".into(), -// "Prompt".into(), -// "Negative Prompt".into(), -// "Adapt Input Image".into(), -// "Image Creativity".into(), -// "Inpaint".into(), -// "Mask Blur".into(), -// "Mask Starting Fill".into(), -// "Improve Faces".into(), -// "Tiling".into(), -// ], -// output_names: vec!["Image".to_string()], -// ..Default::default() -// }, -// }, -// description: Cow::Borrowed("TODO"), -// properties: None, // Some(&node_properties::imaginate_properties), -// }); - type NodeProperties = HashMap Vec + Send + Sync>>; pub static NODE_OVERRIDES: once_cell::sync::Lazy = once_cell::sync::Lazy::new(static_node_properties); @@ -2975,19 +2852,3 @@ impl DocumentNodeDefinition { self.node_template_input_override(self.node_template.document_node.inputs.clone().into_iter().map(Some)) } } - -// Previously used by the Imaginate node, but usage was commented out since it did nothing. -// pub fn new_image_network(output_offset: i32, output_node_id: NodeId) -> NodeNetwork { -// let mut network = NodeNetwork { ..Default::default() }; -// network.push_node_to_document_network( -// resolve_document_node_type("Input Frame") -// .expect("Input Frame node does not exist") -// .to_document_node_default_inputs([], DocumentNodeMetadata::position((8, 4))), -// ); -// network.push_node_to_document_network( -// resolve_document_node_type("Output") -// .expect("Output node does not exist") -// .to_document_node([NodeInput::node(output_node_id, 0)], DocumentNodeMetadata::position((output_offset + 8, 4))), -// ); -// network -// } diff --git a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs index 182a3dc44d..97f46b0ac6 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs @@ -1396,12 +1396,7 @@ impl<'a> MessageHandler> for NodeGrap input, }); responses.add(PropertiesPanelMessage::Refresh); - if (network_interface - .reference(&node_id, selection_network_path) - .is_none_or(|reference| *reference != Some("Imaginate".to_string())) // TODO: Potentially remove the reference to Imaginate - || input_index == 0) - && network_interface.connected_to_output(&node_id, selection_network_path) - { + if (network_interface.reference(&node_id, selection_network_path).is_none() || input_index == 0) && network_interface.connected_to_output(&node_id, selection_network_path) { responses.add(NodeGraphMessage::RunDocumentGraph); } } diff --git a/editor/src/messages/portfolio/document/node_graph/node_properties_imaginate.rs b/editor/src/messages/portfolio/document/node_graph/node_properties_imaginate.rs deleted file mode 100644 index 255bff60e1..0000000000 --- a/editor/src/messages/portfolio/document/node_graph/node_properties_imaginate.rs +++ /dev/null @@ -1,547 +0,0 @@ -//! This has all been copied out of node_properties.rs to avoid leaving hundreds of lines of commented out code in that file. It's left here instead for future reference. - -// pub fn imaginate_sampling_method(parameter_widgets_info: ParameterWidgetsInfo) -> LayoutGroup { -// let ParameterWidgetsInfo { node_id, index, .. } = parameter_widgets_info; - -// vec![ -// DropdownInput::new( -// ImaginateSamplingMethod::list() -// .into_iter() -// .map(|method| { -// vec![ -// MenuListEntry::new(format!("{:?}", method)) -// .label(method.to_string()) -// .on_update(update_value(move |_| TaggedValue::ImaginateSamplingMethod(method), node_id, index)), -// ] -// }) -// .collect(), -// ) -// .widget_holder(), -// ] -// .into() -// } - -// pub fn imaginate_mask_starting_fill(parameter_widgets_info: ParameterWidgetsInfo) -> LayoutGroup { -// let ParameterWidgetsInfo { node_id, index, .. } = parameter_widgets_info; - -// vec![ -// DropdownInput::new( -// ImaginateMaskStartingFill::list() -// .into_iter() -// .map(|fill| { -// vec![ -// MenuListEntry::new(format!("{:?}", fill)) -// .label(fill.to_string()) -// .on_update(update_value(move |_| TaggedValue::ImaginateMaskStartingFill(fill), node_id, index)), -// ] -// }) -// .collect(), -// ) -// .widget_holder(), -// ] -// .into() -// } - -// pub(crate) fn imaginate_properties(node_id: NodeId, context: &mut NodePropertiesContext) -> Vec { -// let imaginate_node = [context.selection_network_path, &[node_id]].concat(); - -// let resolve_input = |name: &str| { -// IMAGINATE_NODE -// .default_node_template() -// .persistent_node_metadata -// .input_properties -// .iter() -// .position(|row| row.input_name.as_str() == name) -// .unwrap_or_else(|| panic!("Input {name} not found")) -// }; -// let seed_index = resolve_input("Seed"); -// let resolution_index = resolve_input("Resolution"); -// let samples_index = resolve_input("Samples"); -// let sampling_method_index = resolve_input("Sampling Method"); -// let text_guidance_index = resolve_input("Prompt Guidance"); -// let text_index = resolve_input("Prompt"); -// let neg_index = resolve_input("Negative Prompt"); -// let base_img_index = resolve_input("Adapt Input Image"); -// let img_creativity_index = resolve_input("Image Creativity"); -// // let mask_index = resolve_input("Masking Layer"); -// // let inpaint_index = resolve_input("Inpaint"); -// // let mask_blur_index = resolve_input("Mask Blur"); -// // let mask_fill_index = resolve_input("Mask Starting Fill"); -// let faces_index = resolve_input("Improve Faces"); -// let tiling_index = resolve_input("Tiling"); - -// let document_node = match get_document_node(node_id, context) { -// Ok(document_node) => document_node, -// Err(err) => { -// log::error!("Could not get document node in imaginate_properties: {err}"); -// return Vec::new(); -// } -// }; -// let controller = &document_node.inputs[resolve_input("Controller")]; - -// let server_status = { -// let server_status = context.persistent_data.imaginate.server_status(); -// let status_text = server_status.to_text(); -// let mut widgets = vec![ -// TextLabel::new("Server").widget_holder(), -// Separator::new(SeparatorType::Unrelated).widget_holder(), -// IconButton::new("Settings", 24) -// .tooltip("Preferences: Imaginate") -// .on_update(|_| DialogMessage::RequestPreferencesDialog.into()) -// .widget_holder(), -// Separator::new(SeparatorType::Unrelated).widget_holder(), -// TextLabel::new(status_text).bold(true).widget_holder(), -// Separator::new(SeparatorType::Related).widget_holder(), -// IconButton::new("Reload", 24) -// .tooltip("Refresh connection status") -// .on_update(|_| PortfolioMessage::ImaginateCheckServerStatus.into()) -// .widget_holder(), -// ]; -// if let ImaginateServerStatus::Unavailable | ImaginateServerStatus::Failed(_) = server_status { -// widgets.extend([ -// Separator::new(SeparatorType::Unrelated).widget_holder(), -// TextButton::new("Server Help") -// .tooltip("Learn how to connect Imaginate to an image generation server") -// .on_update(|_| { -// FrontendMessage::TriggerVisitLink { -// url: "https://github.com/GraphiteEditor/Graphite/discussions/1089".to_string(), -// } -// .into() -// }) -// .widget_holder(), -// ]); -// } -// LayoutGroup::Row { widgets }.with_tooltip("Connection status to the server that computes generated images") -// }; - -// let Some(TaggedValue::ImaginateController(controller)) = controller.as_value() else { -// panic!("Invalid output status input") -// }; -// let imaginate_status = controller.get_status(); - -// let use_base_image = if let Some(&TaggedValue::Bool(use_base_image)) = &document_node.inputs[base_img_index].as_value() { -// use_base_image -// } else { -// true -// }; - -// let transform_not_connected = false; - -// let progress = { -// let mut widgets = vec![TextLabel::new("Progress").widget_holder(), Separator::new(SeparatorType::Unrelated).widget_holder()]; -// add_blank_assist(&mut widgets); -// let status = imaginate_status.to_text(); -// widgets.push(TextLabel::new(status.as_ref()).bold(true).widget_holder()); -// LayoutGroup::Row { widgets }.with_tooltip(match imaginate_status { -// ImaginateStatus::Failed(_) => status.as_ref(), -// _ => "When generating, the percentage represents how many sampling steps have so far been processed out of the target number", -// }) -// }; - -// let image_controls = { -// let mut widgets = vec![TextLabel::new("Image").widget_holder(), Separator::new(SeparatorType::Unrelated).widget_holder()]; - -// match &imaginate_status { -// ImaginateStatus::Beginning | ImaginateStatus::Uploading => { -// add_blank_assist(&mut widgets); -// widgets.push(TextButton::new("Beginning...").tooltip("Sending image generation request to the server").disabled(true).widget_holder()); -// } -// ImaginateStatus::Generating(_) => { -// add_blank_assist(&mut widgets); -// widgets.push( -// TextButton::new("Terminate") -// .tooltip("Cancel the in-progress image generation and keep the latest progress") -// .on_update({ -// let controller = controller.clone(); -// move |_| { -// controller.request_termination(); -// Message::NoOp -// } -// }) -// .widget_holder(), -// ); -// } -// ImaginateStatus::Terminating => { -// add_blank_assist(&mut widgets); -// widgets.push( -// TextButton::new("Terminating...") -// .tooltip("Waiting on the final image generated after termination") -// .disabled(true) -// .widget_holder(), -// ); -// } -// ImaginateStatus::Ready | ImaginateStatus::ReadyDone | ImaginateStatus::Terminated | ImaginateStatus::Failed(_) => widgets.extend_from_slice(&[ -// IconButton::new("Random", 24) -// .tooltip("Generate with a new random seed") -// .on_update({ -// let imaginate_node = imaginate_node.clone(); -// let controller = controller.clone(); -// move |_| { -// controller.trigger_regenerate(); -// DocumentMessage::ImaginateRandom { -// imaginate_node: imaginate_node.clone(), -// then_generate: true, -// } -// .into() -// } -// }) -// .widget_holder(), -// Separator::new(SeparatorType::Unrelated).widget_holder(), -// TextButton::new("Generate") -// .tooltip("Fill layer frame by generating a new image") -// .on_update({ -// let controller = controller.clone(); -// let imaginate_node = imaginate_node.clone(); -// move |_| { -// controller.trigger_regenerate(); -// DocumentMessage::ImaginateGenerate { -// imaginate_node: imaginate_node.clone(), -// } -// .into() -// } -// }) -// .widget_holder(), -// Separator::new(SeparatorType::Related).widget_holder(), -// TextButton::new("Clear") -// .tooltip("Remove generated image from the layer frame") -// .disabled(!matches!(imaginate_status, ImaginateStatus::ReadyDone)) -// .on_update({ -// let controller = controller.clone(); -// let imaginate_node = imaginate_node.clone(); -// move |_| { -// controller.set_status(ImaginateStatus::Ready); -// DocumentMessage::ImaginateGenerate { -// imaginate_node: imaginate_node.clone(), -// } -// .into() -// } -// }) -// .widget_holder(), -// ]), -// } -// LayoutGroup::Row { widgets }.with_tooltip("Buttons that control the image generation process") -// }; - -// // Requires custom layout for the regenerate button -// let seed = { -// let mut widgets = start_widgets(document_node, node_id, seed_index, "Seed", FrontendGraphDataType::Number, false); - -// let Some(input) = document_node.inputs.get(seed_index) else { -// log::warn!("A widget failed to be built because its node's input index is invalid."); -// return vec![]; -// }; -// if let Some(&TaggedValue::F64(seed)) = &input.as_non_exposed_value() { -// widgets.extend_from_slice(&[ -// Separator::new(SeparatorType::Unrelated).widget_holder(), -// IconButton::new("Resync", 24) -// .tooltip("Set a new random seed") -// .on_update({ -// let imaginate_node = imaginate_node.clone(); -// move |_| { -// DocumentMessage::ImaginateRandom { -// imaginate_node: imaginate_node.clone(), -// then_generate: false, -// } -// .into() -// } -// }) -// .widget_holder(), -// Separator::new(SeparatorType::Unrelated).widget_holder(), -// NumberInput::new(Some(seed)) -// .int() -// .min(-((1_u64 << f64::MANTISSA_DIGITS) as f64)) -// .max((1_u64 << f64::MANTISSA_DIGITS) as f64) -// .on_update(update_value(move |input: &NumberInput| TaggedValue::F64(input.value.unwrap()), node_id, seed_index)) -// .on_commit(commit_value) -// .mode(NumberInputMode::Increment) -// .widget_holder(), -// ]) -// } -// // Note: Limited by f64. You cannot even have all the possible u64 values :) -// LayoutGroup::Row { widgets }.with_tooltip("Seed determines the random outcome, enabling limitless unique variations") -// }; - -// // let transform = context -// // .executor -// // .introspect_node_in_network(context.network, &imaginate_node, |network| network.inputs.first().copied(), |frame: &RasterData| frame.transform) -// // .unwrap_or_default(); -// let image_size = context -// .executor -// .introspect_node_in_network( -// context.network_interface.document_network().unwrap(), -// &imaginate_node, -// |network| { -// network -// .nodes -// .iter() -// .find(|node| { -// node.1 -// .inputs -// .iter() -// .any(|node_input| if let NodeInput::Network { import_index, .. } = node_input { *import_index == 0 } else { false }) -// }) -// .map(|(node_id, _)| node_id) -// .copied() -// }, -// |frame: &IORecord<(), RasterData>| (frame.output.image.width, frame.output.image.height), -// ) -// .unwrap_or_default(); - -// let document_node = match get_document_node(node_id, context) { -// Ok(document_node) => document_node, -// Err(err) => { -// log::error!("Could not get document node in imaginate_properties: {err}"); -// return Vec::new(); -// } -// }; - -// let resolution = { -// let mut widgets = start_widgets(document_node, node_id, resolution_index, "Resolution", FrontendGraphDataType::Number, false); - -// let round = |size: DVec2| { -// let (x, y) = graphene_std::imaginate::pick_safe_imaginate_resolution(size.into()); -// DVec2::new(x as f64, y as f64) -// }; - -// let Some(input) = document_node.inputs.get(resolution_index) else { -// log::warn!("A widget failed to be built because its node's input index is invalid."); -// return vec![]; -// }; -// if let Some(&TaggedValue::OptionalDVec2(vec2)) = &input.as_non_exposed_value() { -// let dimensions_is_auto = vec2.is_none(); -// let vec2 = vec2.unwrap_or_else(|| round((image_size.0 as f64, image_size.1 as f64).into())); - -// widgets.extend_from_slice(&[ -// Separator::new(SeparatorType::Unrelated).widget_holder(), -// IconButton::new("FrameAll", 24) -// .tooltip("Set the layer dimensions to this resolution") -// .on_update(move |_| DialogMessage::RequestComingSoonDialog { issue: None }.into()) -// .widget_holder(), -// Separator::new(SeparatorType::Unrelated).widget_holder(), -// CheckboxInput::new(!dimensions_is_auto || transform_not_connected) -// .icon("Edit12px") -// .tooltip({ -// let message = "Set a custom resolution instead of using the input's dimensions (rounded to the nearest 64)"; -// let manual_message = "Set a custom resolution instead of using the input's dimensions (rounded to the nearest 64).\n\ -// \n\ -// (Resolution must be set manually while the 'Transform' input is disconnected.)"; - -// if transform_not_connected { -// manual_message -// } else { -// message -// } -// }) -// .disabled(transform_not_connected) -// .on_update(update_value( -// move |checkbox_input: &CheckboxInput| TaggedValue::OptionalDVec2(if checkbox_input.checked { Some(vec2) } else { None }), -// node_id, -// resolution_index, -// )) -// .on_commit(commit_value) -// .for_label(checkbox_id.clone()) -// .widget_holder(), -// Separator::new(SeparatorType::Related).widget_holder(), -// NumberInput::new(Some(vec2.x)) -// .label("W") -// .min(64.) -// .step(64.) -// .unit(" px") -// .disabled(dimensions_is_auto && !transform_not_connected) -// .on_update(update_value( -// move |number_input: &NumberInput| TaggedValue::OptionalDVec2(Some(round(DVec2::new(number_input.value.unwrap(), vec2.y)))), -// node_id, -// resolution_index, -// )) -// .on_commit(commit_value) -// .widget_holder(), -// Separator::new(SeparatorType::Related).widget_holder(), -// NumberInput::new(Some(vec2.y)) -// .label("H") -// .min(64.) -// .step(64.) -// .unit(" px") -// .disabled(dimensions_is_auto && !transform_not_connected) -// .on_update(update_value( -// move |number_input: &NumberInput| TaggedValue::OptionalDVec2(Some(round(DVec2::new(vec2.x, number_input.value.unwrap())))), -// node_id, -// resolution_index, -// )) -// .on_commit(commit_value) -// .widget_holder(), -// ]) -// } -// LayoutGroup::Row { widgets }.with_tooltip( -// "Width and height of the image that will be generated. Larger resolutions take longer to compute.\n\ -// \n\ -// 512x512 yields optimal results because the AI is trained to understand that scale best. Larger sizes may tend to integrate the prompt's subject more than once. Small sizes are often incoherent.\n\ -// \n\ -// Dimensions must be a multiple of 64, so these are set by rounding the layer dimensions. A resolution exceeding 1 megapixel is reduced below that limit because larger sizes may exceed available GPU memory on the server.") -// }; - -// let sampling_steps = { -// let widgets = number_widget(document_node, node_id, samples_index, "Sampling Steps", NumberInput::default().min(0.).max(150.).int(), true); -// LayoutGroup::Row { widgets }.with_tooltip("Number of iterations to improve the image generation quality, with diminishing returns around 40 when using the Euler A sampling method") -// }; - -// let sampling_method = { -// let mut widgets = start_widgets(document_node, node_id, sampling_method_index, "Sampling Method", FrontendGraphDataType::General, true); - -// let Some(input) = document_node.inputs.get(sampling_method_index) else { -// log::warn!("A widget failed to be built because its node's input index is invalid."); -// return vec![]; -// }; -// if let Some(&TaggedValue::ImaginateSamplingMethod(sampling_method)) = &input.as_non_exposed_value() { -// let sampling_methods = ImaginateSamplingMethod::list(); -// let mut entries = Vec::with_capacity(sampling_methods.len()); -// for method in sampling_methods { -// entries.push( -// MenuListEntry::new(format!("{method:?}")) -// .label(method.to_string()) -// .on_update(update_value(move |_| TaggedValue::ImaginateSamplingMethod(method), node_id, sampling_method_index)) -// .on_commit(commit_value), -// ); -// } -// let entries = vec![entries]; - -// widgets.extend_from_slice(&[ -// Separator::new(SeparatorType::Unrelated).widget_holder(), -// DropdownInput::new(entries).selected_index(Some(sampling_method as u32)).widget_holder(), -// ]); -// } -// LayoutGroup::Row { widgets }.with_tooltip("Algorithm used to generate the image during each sampling step") -// }; - -// let text_guidance = { -// let widgets = number_widget(document_node, node_id, text_guidance_index, "Prompt Guidance", NumberInput::default().min(0.).max(30.), true); -// LayoutGroup::Row { widgets }.with_tooltip( -// "Amplification of the text prompt's influence over the outcome. At 0, the prompt is entirely ignored.\n\ -// \n\ -// Lower values are more creative and exploratory. Higher values are more literal and uninspired.\n\ -// \n\ -// This parameter is otherwise known as CFG (classifier-free guidance).", -// ) -// }; - -// let text_prompt = { -// let widgets = text_area_widget(document_node, node_id, text_index, "Prompt", true); -// LayoutGroup::Row { widgets }.with_tooltip( -// "Description of the desired image subject and style.\n\ -// \n\ -// Include an artist name like \"Rembrandt\" or art medium like \"watercolor\" or \"photography\" to influence the look. List multiple to meld styles.\n\ -// \n\ -// To boost (or lessen) the importance of a word or phrase, wrap it in parentheses ending with a colon and a multiplier, for example:\n\ -// \"Colorless green ideas (sleep:1.3) furiously\"", -// ) -// }; -// let negative_prompt = { -// let widgets = text_area_widget(document_node, node_id, neg_index, "Negative Prompt", true); -// LayoutGroup::Row { widgets }.with_tooltip("A negative text prompt can be used to list things like objects or colors to avoid") -// }; -// let base_image = { -// let widgets = bool_widget(document_node, node_id, base_img_index, "Adapt Input Image", CheckboxInput::default().for_label(checkbox_id.clone()), true); -// LayoutGroup::Row { widgets }.with_tooltip("Generate an image based upon the bitmap data plugged into this node") -// }; -// let image_creativity = { -// let props = NumberInput::default().percentage().disabled(!use_base_image); -// let widgets = number_widget(document_node, node_id, img_creativity_index, "Image Creativity", props, true); -// LayoutGroup::Row { widgets }.with_tooltip( -// "Strength of the artistic liberties allowing changes from the input image. The image is unchanged at 0% and completely different at 100%.\n\ -// \n\ -// This parameter is otherwise known as denoising strength.", -// ) -// }; - -// let mut layout = vec![ -// server_status, -// progress, -// image_controls, -// seed, -// resolution, -// sampling_steps, -// sampling_method, -// text_guidance, -// text_prompt, -// negative_prompt, -// base_image, -// image_creativity, -// // layer_mask, -// ]; - -// // if use_base_image && layer_reference_input_layer_is_some { -// // let in_paint = { -// // let mut widgets = start_widgets(document_node, node_id, inpaint_index, "Inpaint", FrontendGraphDataType::Boolean, true); - -// // if let Some(& TaggedValue::Bool(in_paint) -// //)/ } = &document_node.inputs[inpaint_index].as_non_exposed_value() -// // { -// // widgets.extend_from_slice(&[ -// // Separator::new(SeparatorType::Unrelated).widget_holder(), -// // RadioInput::new( -// // [(true, "Inpaint"), (false, "Outpaint")] -// // .into_iter() -// // .map(|(paint, name)| RadioEntryData::new(name).label(name).on_update(update_value(move |_| TaggedValue::Bool(paint), node_id, inpaint_index))) -// // .collect(), -// // ) -// // .selected_index(Some(1 - in_paint as u32)) -// // .widget_holder(), -// // ]); -// // } -// // LayoutGroup::Row { widgets }.with_tooltip( -// // "Constrain image generation to the interior (inpaint) or exterior (outpaint) of the mask, while referencing the other unchanged parts as context imagery.\n\ -// // \n\ -// // An unwanted part of an image can be replaced by drawing around it with a black shape and inpainting with that mask layer.\n\ -// // \n\ -// // An image can be uncropped by resizing the Imaginate layer to the target bounds and outpainting with a black rectangle mask matching the original image bounds.", -// // ) -// // }; - -// // let blur_radius = { -// // let number_props = NumberInput::default().unit(" px").min(0.).max(25.).int(); -// // let widgets = number_widget(document_node, node_id, mask_blur_index, "Mask Blur", number_props, true); -// // LayoutGroup::Row { widgets }.with_tooltip("Blur radius for the mask. Useful for softening sharp edges to blend the masked area with the rest of the image.") -// // }; - -// // let mask_starting_fill = { -// // let mut widgets = start_widgets(document_node, node_id, mask_fill_index, "Mask Starting Fill", FrontendGraphDataType::General, true); - -// // if let Some(& TaggedValue::ImaginateMaskStartingFill(starting_fill) -// //)/ } = &document_node.inputs[mask_fill_index].as_non_exposed_value() -// // { -// // let mask_fill_content_modes = ImaginateMaskStartingFill::list(); -// // let mut entries = Vec::with_capacity(mask_fill_content_modes.len()); -// // for mode in mask_fill_content_modes { -// // entries.push(MenuListEntry::new(format!("{mode:?}")).label(mode.to_string()).on_update(update_value(move |_| TaggedValue::ImaginateMaskStartingFill(mode), node_id, mask_fill_index))); -// // } -// // let entries = vec![entries]; - -// // widgets.extend_from_slice(&[ -// // Separator::new(SeparatorType::Unrelated).widget_holder(), -// // DropdownInput::new(entries).selected_index(Some(starting_fill as u32)).widget_holder(), -// // ]); -// // } -// // LayoutGroup::Row { widgets }.with_tooltip( -// // "Begin in/outpainting the masked areas using this fill content as the starting input image.\n\ -// // \n\ -// // Each option can be visualized by generating with 'Sampling Steps' set to 0.", -// // ) -// // }; -// // layout.extend_from_slice(&[in_paint, blur_radius, mask_starting_fill]); -// // } - -// let improve_faces = { -// let widgets = bool_widget(document_node, node_id, faces_index, "Improve Faces", CheckboxInput::default().for_label(checkbox_id.clone()), true); -// LayoutGroup::Row { widgets }.with_tooltip( -// "Postprocess human (or human-like) faces to look subtly less distorted.\n\ -// \n\ -// This filter can be used on its own by enabling 'Adapt Input Image' and setting 'Sampling Steps' to 0.", -// ) -// }; -// let tiling = { -// let widgets = bool_widget(document_node, node_id, tiling_index, "Tiling", CheckboxInput::default().for_label(checkbox_id.clone()), true); -// LayoutGroup::Row { widgets }.with_tooltip("Generate the image so its edges loop seamlessly to make repeatable patterns or textures") -// }; -// layout.extend_from_slice(&[improve_faces, tiling]); - -// layout -// } diff --git a/editor/src/messages/portfolio/portfolio_message.rs b/editor/src/messages/portfolio/portfolio_message.rs index e116d40825..cb2fa34e3e 100644 --- a/editor/src/messages/portfolio/portfolio_message.rs +++ b/editor/src/messages/portfolio/portfolio_message.rs @@ -54,9 +54,6 @@ pub enum PortfolioMessage { preview_url: String, data: Vec, }, - // ImaginateCheckServerStatus, - // ImaginatePollServerStatus, - // ImaginateServerHostname, Import, LoadDocumentResources { document_id: DocumentId, diff --git a/editor/src/messages/portfolio/portfolio_message_handler.rs b/editor/src/messages/portfolio/portfolio_message_handler.rs index 4939092b99..5abb0918b4 100644 --- a/editor/src/messages/portfolio/portfolio_message_handler.rs +++ b/editor/src/messages/portfolio/portfolio_message_handler.rs @@ -328,35 +328,7 @@ impl MessageHandler> for PortfolioMes responses.add(NodeGraphMessage::RunDocumentGraph); } } - // PortfolioMessage::ImaginateCheckServerStatus => { - // let server_status = self.persistent_data.imaginate.server_status().clone(); - // self.persistent_data.imaginate.poll_server_check(); - // #[cfg(target_arch = "wasm32")] - // if let Some(fut) = self.persistent_data.imaginate.initiate_server_check() { - // wasm_bindgen_futures::spawn_local(async move { - // let () = fut.await; - // use wasm_bindgen::prelude::*; - - // #[wasm_bindgen(module = "/../frontend/src/editor.ts")] - // extern "C" { - // #[wasm_bindgen(js_name = injectImaginatePollServerStatus)] - // fn inject(); - // } - // inject(); - // }) - // } - // if &server_status != self.persistent_data.imaginate.server_status() { - // responses.add(PropertiesPanelMessage::Refresh); - // } - // } - // PortfolioMessage::ImaginatePollServerStatus => { - // self.persistent_data.imaginate.poll_server_check(); - // responses.add(PropertiesPanelMessage::Refresh); - // } PortfolioMessage::EditorPreferences => self.executor.update_editor_preferences(preferences.editor_preferences()), - // PortfolioMessage::ImaginateServerHostname => { - // self.persistent_data.imaginate.set_host_name(&preferences.imaginate_server_hostname); - // } PortfolioMessage::Import => { // This portfolio message wraps the frontend message so it can be listed as an action, which isn't possible for frontend messages responses.add(FrontendMessage::TriggerImport); diff --git a/editor/src/messages/portfolio/utility_types.rs b/editor/src/messages/portfolio/utility_types.rs index 062feda005..fb0b2e4b4d 100644 --- a/editor/src/messages/portfolio/utility_types.rs +++ b/editor/src/messages/portfolio/utility_types.rs @@ -4,7 +4,6 @@ use graphene_std::text::FontCache; pub struct PersistentData { pub font_cache: FontCache, pub use_vello: bool, - // pub imaginate: ImaginatePersistentData, } #[derive(PartialEq, Eq, Clone, Copy, Default, Debug, serde::Serialize, serde::Deserialize)] diff --git a/editor/src/messages/preferences/preferences_message.rs b/editor/src/messages/preferences/preferences_message.rs index 933ea1ef2e..11b32deadd 100644 --- a/editor/src/messages/preferences/preferences_message.rs +++ b/editor/src/messages/preferences/preferences_message.rs @@ -16,6 +16,4 @@ pub enum PreferencesMessage { ModifyLayout { zoom_with_scroll: bool }, GraphWireStyle { style: GraphWireStyle }, ViewportZoomWheelRate { rate: f64 }, - // ImaginateRefreshFrequency { seconds: f64 }, - // ImaginateServerHostname { hostname: String }, } diff --git a/editor/src/messages/preferences/preferences_message_handler.rs b/editor/src/messages/preferences/preferences_message_handler.rs index b1f607b985..d6ec4d9376 100644 --- a/editor/src/messages/preferences/preferences_message_handler.rs +++ b/editor/src/messages/preferences/preferences_message_handler.rs @@ -7,8 +7,6 @@ use graph_craft::wasm_application_io::EditorPreferences; #[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, specta::Type)] pub struct PreferencesMessageHandler { - // pub imaginate_server_hostname: String, - // pub imaginate_refresh_frequency: f64, pub selection_mode: SelectionMode, pub zoom_with_scroll: bool, pub use_vello: bool, @@ -24,7 +22,6 @@ impl PreferencesMessageHandler { pub fn editor_preferences(&self) -> EditorPreferences { EditorPreferences { - // imaginate_hostname: self.imaginate_server_hostname.clone(), use_vello: self.use_vello && self.supports_wgpu(), } } @@ -37,8 +34,6 @@ impl PreferencesMessageHandler { impl Default for PreferencesMessageHandler { fn default() -> Self { Self { - // imaginate_server_hostname: EditorPreferences::default().imaginate_hostname, - // imaginate_refresh_frequency: 1., selection_mode: SelectionMode::Touched, zoom_with_scroll: matches!(MappingVariant::default(), MappingVariant::ZoomWithScroll), use_vello: EditorPreferences::default().use_vello, @@ -57,10 +52,6 @@ impl MessageHandler for PreferencesMessageHandler { if let Ok(deserialized_preferences) = serde_json::from_str::(&preferences) { *self = deserialized_preferences; - // TODO: Reenable when Imaginate is restored - // responses.add(PortfolioMessage::ImaginateServerHostname); - // responses.add(PortfolioMessage::ImaginateCheckServerStatus); - responses.add(PortfolioMessage::EditorPreferences); responses.add(PortfolioMessage::UpdateVelloPreference); responses.add(PreferencesMessage::ModifyLayout { @@ -101,27 +92,6 @@ impl MessageHandler for PreferencesMessageHandler { self.viewport_zoom_wheel_rate = rate; } } - // TODO: Reenable when Imaginate is restored (and move back up one line since the auto-formatter doesn't like it in that block) - // PreferencesMessage::ImaginateRefreshFrequency { seconds } => { - // self.imaginate_refresh_frequency = seconds; - // responses.add(PortfolioMessage::ImaginateCheckServerStatus); - // responses.add(PortfolioMessage::EditorPreferences); - // } - // PreferencesMessage::ImaginateServerHostname { hostname } => { - // let initial = hostname.clone(); - // let has_protocol = hostname.starts_with("http://") || hostname.starts_with("https://"); - // let hostname = if has_protocol { hostname } else { "http://".to_string() + &hostname }; - // let hostname = if hostname.ends_with('/') { hostname } else { hostname + "/" }; - - // if hostname != initial { - // refresh_dialog(responses); - // } - - // self.imaginate_server_hostname = hostname; - // responses.add(PortfolioMessage::ImaginateServerHostname); - // responses.add(PortfolioMessage::ImaginateCheckServerStatus); - // responses.add(PortfolioMessage::EditorPreferences); - //} responses.add(FrontendMessage::TriggerSavePreferences { preferences: self.clone() }); } diff --git a/editor/src/messages/prelude.rs b/editor/src/messages/prelude.rs index eb6900a53f..d33b7c235c 100644 --- a/editor/src/messages/prelude.rs +++ b/editor/src/messages/prelude.rs @@ -38,7 +38,6 @@ pub use crate::messages::tool::tool_messages::eyedropper_tool::{EyedropperToolMe pub use crate::messages::tool::tool_messages::fill_tool::{FillToolMessage, FillToolMessageDiscriminant}; pub use crate::messages::tool::tool_messages::freehand_tool::{FreehandToolMessage, FreehandToolMessageDiscriminant}; pub use crate::messages::tool::tool_messages::gradient_tool::{GradientToolMessage, GradientToolMessageDiscriminant}; -// pub use crate::messages::tool::tool_messages::imaginate_tool::{ImaginateToolMessage, ImaginateToolMessageDiscriminant}; pub use crate::messages::tool::tool_messages::navigate_tool::{NavigateToolMessage, NavigateToolMessageDiscriminant}; pub use crate::messages::tool::tool_messages::path_tool::{PathToolMessage, PathToolMessageDiscriminant}; pub use crate::messages::tool::tool_messages::pen_tool::{PenToolMessage, PenToolMessageDiscriminant}; diff --git a/editor/src/messages/tool/tool_message.rs b/editor/src/messages/tool/tool_message.rs index 6a5d893e38..6c6178b46e 100644 --- a/editor/src/messages/tool/tool_message.rs +++ b/editor/src/messages/tool/tool_message.rs @@ -48,17 +48,17 @@ pub enum ToolMessage { // Relight(RelightToolMessage), // // #[child] // Detail(DetailToolMessage), - // #[child] - // Imaginate(ImaginateToolMessage), // Messages + + // General tools ActivateToolSelect, ActivateToolArtboard, ActivateToolNavigate, ActivateToolEyedropper, ActivateToolFill, ActivateToolGradient, - + // Vector tools ActivateToolPath, ActivateToolPen, ActivateToolFreehand, @@ -68,10 +68,9 @@ pub enum ToolMessage { ActivateToolShapeEllipse, ActivateToolShape, ActivateToolText, - + // Raster tools ActivateToolBrush, - // ActivateToolImaginate, - // + ActivateTool { tool_type: ToolType, }, diff --git a/editor/src/messages/tool/tool_message_handler.rs b/editor/src/messages/tool/tool_message_handler.rs index badf9ac5f3..6a1f8fef83 100644 --- a/editor/src/messages/tool/tool_message_handler.rs +++ b/editor/src/messages/tool/tool_message_handler.rs @@ -82,7 +82,6 @@ impl MessageHandler> for ToolMessageHandler { responses.add(ShapeToolMessage::HideShapeTypeWidget(true)); responses.add(ShapeToolMessage::SetShape(shape)); } - // ToolMessage::ActivateToolImaginate => responses.add_front(ToolMessage::ActivateTool { tool_type: ToolType::Imaginate }), ToolMessage::ActivateTool { tool_type } => { let tool_data = &mut self.tool_state.tool_data; let old_tool = tool_data.active_tool_type.get_tool(); @@ -340,7 +339,6 @@ impl MessageHandler> for ToolMessageHandler { ActivateToolText, ActivateToolBrush, - // ActivateToolImaginate, SelectRandomPrimaryColor, ResetColors, diff --git a/editor/src/messages/tool/tool_messages/imaginate_tool.rs b/editor/src/messages/tool/tool_messages/imaginate_tool.rs deleted file mode 100644 index 79a952865d..0000000000 --- a/editor/src/messages/tool/tool_messages/imaginate_tool.rs +++ /dev/null @@ -1,184 +0,0 @@ -use super::tool_prelude::*; -use crate::messages::tool::common_functionality::resize::Resize; - -#[derive(Default)] -pub struct ImaginateTool { - fsm_state: ImaginateToolFsmState, - tool_data: ImaginateToolData, -} - -#[impl_message(Message, ToolMessage, Imaginate)] -#[derive(PartialEq, Eq, Clone, Debug, Hash, serde::Serialize, serde::Deserialize, specta::Type)] -pub enum ImaginateToolMessage { - // Standard messages - Abort, - - // Tool-specific messages - DragStart, - DragStop, - Resize { center: Key, lock_ratio: Key }, -} - -impl LayoutHolder for ImaginateTool { - fn layout(&self) -> Layout { - Layout::WidgetLayout(WidgetLayout::default()) - } -} - -impl<'a> MessageHandler> for ImaginateTool { - fn process_message(&mut self, message: ToolMessage, responses: &mut VecDeque, tool_data: &mut ToolActionHandlerData<'a>) { - self.fsm_state.process_event(message, &mut self.tool_data, tool_data, &(), responses, true); - } - - fn actions(&self) -> ActionList { - match self.fsm_state { - ImaginateToolFsmState::Ready => actions!(ImaginateToolMessageDiscriminant; - DragStart, - ), - ImaginateToolFsmState::Drawing => actions!(ImaginateToolMessageDiscriminant; - DragStop, - Abort, - Resize, - ), - } - } -} - -impl ToolMetadata for ImaginateTool { - fn icon_name(&self) -> String { - "RasterImaginateTool".into() - } - fn tooltip(&self) -> String { - "Imaginate Tool".into() - } - fn tool_type(&self) -> crate::messages::tool::utility_types::ToolType { - ToolType::Imaginate - } -} - -impl ToolTransition for ImaginateTool { - fn event_to_message_map(&self) -> EventToMessageMap { - EventToMessageMap { - tool_abort: Some(ImaginateToolMessage::Abort.into()), - ..Default::default() - } - } -} - -#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] -enum ImaginateToolFsmState { - #[default] - Ready, - Drawing, -} - -#[derive(Clone, Debug, Default)] -struct ImaginateToolData { - data: Resize, -} - -impl Fsm for ImaginateToolFsmState { - type ToolData = ImaginateToolData; - type ToolOptions = (); - - fn transition( - self, - event: ToolMessage, - tool_data: &mut Self::ToolData, - ToolActionHandlerData { document, input, .. }: &mut ToolActionHandlerData, - _tool_options: &Self::ToolOptions, - responses: &mut VecDeque, - ) -> Self { - let shape_data = &mut tool_data.data; - - let ToolMessage::Imaginate(event) = event else { return self }; - match (self, event) { - (ImaginateToolFsmState::Ready, ImaginateToolMessage::DragStart) => { - shape_data.start(document, input); - // responses.add(DocumentMessage::AddTransaction); - //shape_data.layer = Some(LayerNodeIdentifier::new(NodeId::new(), &document.network_interface)); - responses.add(DocumentMessage::DeselectAllLayers); - - // // Utility function to offset the position of each consecutive node - // let mut pos = 8; - // let mut next_pos = || { - // pos += 8; - // DocumentNodeMetadata::position((pos, 4)) - // }; - - // // Get the node type for the Transform and Imaginate nodes - // let Some(transform_node_type) = resolve_document_node_type("Transform") else { - // warn!("Transform node should be in registry"); - // return ImaginateToolFsmState::Drawing; - // }; - // let imaginate_node_type = &*IMAGINATE_NODE; - - // // Give them a unique ID - // let transform_node_id = NodeId(100); - //let imaginate_node_id = NodeId(101); - - // Create the network based on the Input -> Output passthrough default network - // let mut network = new_image_network(16, imaginate_node_id); - - // // Insert the nodes into the default network - // network.insert_node( - // transform_node_id, - // transform_node_type.to_document_node_default_inputs([Some(NodeInput::node(NodeId(0), 0))], next_pos()), - // ); - // network.insert_node( - // imaginate_node_id, - // imaginate_node_type.to_document_node_default_inputs([Some(NodeInput::node(transform_node_id, 0))], next_pos()), - // ); - // responses.add(NodeGraphMessage::ShiftNode { node_id: imaginate_node_id }); - - // // Add a layer with a frame to the document - // responses.add(Operation::AddFrame { - // path: shape_data.layer.unwrap().to_path(), - // insert_index: -1, - // transform: DAffine2::ZERO.to_cols_array(), - // network, - // }); - - ImaginateToolFsmState::Drawing - } - (state, ImaginateToolMessage::Resize { center, lock_ratio }) => { - let message = shape_data.calculate_transform(document, input, center, lock_ratio, true); - responses.try_add(message); - - state - } - (ImaginateToolFsmState::Drawing, ImaginateToolMessage::DragStop) => { - input.mouse.finish_transaction(shape_data.viewport_drag_start(document), responses); - shape_data.cleanup(responses); - - ImaginateToolFsmState::Ready - } - (ImaginateToolFsmState::Drawing, ImaginateToolMessage::Abort) => { - responses.add(DocumentMessage::AbortTransaction); - - shape_data.cleanup(responses); - - ImaginateToolFsmState::Ready - } - (_, ImaginateToolMessage::Abort) => ImaginateToolFsmState::Ready, - _ => self, - } - } - - fn update_hints(&self, responses: &mut VecDeque) { - let hint_data = match self { - ImaginateToolFsmState::Ready => HintData(vec![HintGroup(vec![ - HintInfo::mouse(MouseMotion::LmbDrag, "Draw Repaint Frame"), - HintInfo::keys([Key::Shift], "Constrain Square").prepend_plus(), - HintInfo::keys([Key::Alt], "From Center").prepend_plus(), - ])]), - ImaginateToolFsmState::Drawing => HintData(vec![HintGroup(vec![HintInfo::keys([Key::Shift], "Constrain Square"), HintInfo::keys([Key::Alt], "From Center")])]), - }; - - responses.add(FrontendMessage::UpdateInputHints { hint_data }); - } - - fn update_cursor(&self, responses: &mut VecDeque) { - responses.add(FrontendMessage::UpdateMouseCursor { cursor: MouseCursorIcon::Crosshair }); - } -} diff --git a/editor/src/messages/tool/tool_messages/mod.rs b/editor/src/messages/tool/tool_messages/mod.rs index b11a20ec09..b95d9c3938 100644 --- a/editor/src/messages/tool/tool_messages/mod.rs +++ b/editor/src/messages/tool/tool_messages/mod.rs @@ -4,7 +4,6 @@ pub mod eyedropper_tool; pub mod fill_tool; pub mod freehand_tool; pub mod gradient_tool; -// pub mod imaginate_tool; pub mod navigate_tool; pub mod path_tool; pub mod pen_tool; diff --git a/editor/src/messages/tool/utility_types.rs b/editor/src/messages/tool/utility_types.rs index f2b441331e..fbbec768e4 100644 --- a/editor/src/messages/tool/utility_types.rs +++ b/editor/src/messages/tool/utility_types.rs @@ -363,7 +363,6 @@ pub enum ToolType { Patch, Detail, Relight, - Imaginate, Frame, } @@ -418,9 +417,6 @@ fn list_tools_in_groups() -> Vec> { ToolAvailability::ComingSoon(ToolEntry::new(ToolType::Patch, "RasterPatchTool").tooltip("Coming Soon: Patch Tool")), ToolAvailability::ComingSoon(ToolEntry::new(ToolType::Detail, "RasterDetailTool").tooltip("Coming Soon: Detail Tool (D)")), ToolAvailability::ComingSoon(ToolEntry::new(ToolType::Relight, "RasterRelightTool").tooltip("Coming Soon: Relight Tool (O)")), - // TODO: Fix and reenable Imaginate tool - // ToolAvailability::Available(Box::::default()), - ToolAvailability::ComingSoon(ToolEntry::new(ToolType::Heal, "RasterImaginateTool").tooltip("Coming Soon: Imaginate Tool")), ], ] } @@ -450,7 +446,6 @@ pub fn tool_message_to_tool_type(tool_message: &ToolMessage) -> ToolType { // ToolMessage::Patch(_) => ToolType::Patch, // ToolMessage::Detail(_) => ToolType::Detail, // ToolMessage::Relight(_) => ToolType::Relight, - // ToolMessage::Imaginate(_) => ToolType::Imaginate, _ => panic!("Conversion from ToolMessage to ToolType impossible because the given ToolMessage does not have a matching ToolType. Got: {tool_message:?}"), } } @@ -483,7 +478,6 @@ pub fn tool_type_to_activate_tool_message(tool_type: ToolType) -> ToolMessageDis // ToolType::Patch => ToolMessageDiscriminant::ActivateToolPatch, // ToolType::Detail => ToolMessageDiscriminant::ActivateToolDetail, // ToolType::Relight => ToolMessageDiscriminant::ActivateToolRelight, - // ToolType::Imaginate => ToolMessageDiscriminant::ActivateToolImaginate, _ => panic!("Conversion from ToolType to ToolMessage impossible because the given ToolType does not have a matching ToolMessage. Got: {tool_type:?}"), } } diff --git a/editor/src/node_graph_executor.rs b/editor/src/node_graph_executor.rs index e6b62da37d..dbb87c07f0 100644 --- a/editor/src/node_graph_executor.rs +++ b/editor/src/node_graph_executor.rs @@ -299,9 +299,6 @@ impl NodeGraphExecutor { } } } - // NodeGraphUpdate::NodeGraphUpdateMessage(NodeGraphUpdateMessage::ImaginateStatusUpdate) => { - // responses.add(DocumentMessage::PropertiesPanel(PropertiesPanelMessage::Refresh)); - // } NodeGraphUpdate::CompilationResponse(execution_response) => { let CompilationResponse { node_graph_errors, result } = execution_response; let type_delta = match result { diff --git a/frontend/src/editor.ts b/frontend/src/editor.ts index cb3bf494fd..7dd6a98951 100644 --- a/frontend/src/editor.ts +++ b/frontend/src/editor.ts @@ -47,9 +47,6 @@ export function createEditor(): Editor { subscriptions.handleJsMessage(messageType, messageData, raw, handle); }); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - (window as any).editorHandle = handle; - // Subscriptions: allows subscribing to messages in JS that are sent from the WASM backend const subscriptions: SubscriptionRouter = createSubscriptionRouter(); @@ -76,12 +73,3 @@ export function createEditor(): Editor { return { raw, handle, subscriptions }; } - -// TODO: Find a better way to do this, since no other code takes this approach. -// TODO: Then, delete the `(window as any).editorHandle = handle;` line above. -// This function is called by an FFI binding within the Rust code directly, rather than using the FrontendMessage system. -// Then, this directly calls the `injectImaginatePollServerStatus` function on the `EditorHandle` object which is a JS binding generated by wasm-bindgen, going straight back into the Rust code. -// export function injectImaginatePollServerStatus() { -// // eslint-disable-next-line @typescript-eslint/no-explicit-any -// (window as any).editorHandle?.injectImaginatePollServerStatus(); -// } diff --git a/node-graph/gapplication-io/src/lib.rs b/node-graph/gapplication-io/src/lib.rs index 06275445c9..d0fd84c6df 100644 --- a/node-graph/gapplication-io/src/lib.rs +++ b/node-graph/gapplication-io/src/lib.rs @@ -193,9 +193,7 @@ pub enum ApplicationError { } #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] -pub enum NodeGraphUpdateMessage { - // ImaginateStatusUpdate, -} +pub enum NodeGraphUpdateMessage {} pub trait NodeGraphUpdateSender { fn send(&self, message: NodeGraphUpdateMessage); @@ -208,7 +206,6 @@ impl NodeGraphUpdateSender for std::sync::Mutex { } pub trait GetEditorPreferences { - // fn hostname(&self) -> &str; fn use_vello(&self) -> bool; } @@ -250,10 +247,6 @@ impl NodeGraphUpdateSender for Logger { struct DummyPreferences; impl GetEditorPreferences for DummyPreferences { - // fn hostname(&self) -> &str { - // "dummy_endpoint" - // } - fn use_vello(&self) -> bool { false } diff --git a/node-graph/gcore/src/graphic_element/renderer.rs b/node-graph/gcore/src/graphic_element/renderer.rs index 165f5a5ed6..f05ef86bb5 100644 --- a/node-graph/gcore/src/graphic_element/renderer.rs +++ b/node-graph/gcore/src/graphic_element/renderer.rs @@ -9,7 +9,6 @@ use crate::uuid::{NodeId, generate_uuid}; use crate::vector::style::{Fill, Stroke, StrokeAlign, ViewMode}; use crate::vector::{PointId, VectorDataTable}; use crate::{Artboard, ArtboardGroupTable, Color, GraphicElement, GraphicGroupTable}; -use base64::Engine; use bezier_rs::Subpath; use dyn_any::DynAny; use glam::{DAffine2, DMat2, DVec2}; @@ -1148,6 +1147,8 @@ impl GraphicElementRendered for RasterDataTable { } let base64_string = image.base64_string.clone().unwrap_or_else(|| { + use base64::Engine; + let output = image.to_png(); let preamble = "data:image/png;base64,"; let mut base64_string = String::with_capacity(preamble.len() + output.len() * 4); diff --git a/node-graph/graph-craft/src/document/value.rs b/node-graph/graph-craft/src/document/value.rs index b45ff25082..3decf5d9c9 100644 --- a/node-graph/graph-craft/src/document/value.rs +++ b/node-graph/graph-craft/src/document/value.rs @@ -248,11 +248,6 @@ tagged_value! { ReferencePoint(graphene_core::transform::ReferencePoint), CentroidType(graphene_core::vector::misc::CentroidType), BooleanOperation(graphene_core::vector::misc::BooleanOperation), - - // ImaginateCache(ImaginateCache), - // ImaginateSamplingMethod(ImaginateSamplingMethod), - // ImaginateMaskStartingFill(ImaginateMaskStartingFill), - // ImaginateController(ImaginateController), } impl TaggedValue { diff --git a/node-graph/graph-craft/src/imaginate_input.rs b/node-graph/graph-craft/src/imaginate_input.rs deleted file mode 100644 index 0c1625cb38..0000000000 --- a/node-graph/graph-craft/src/imaginate_input.rs +++ /dev/null @@ -1,279 +0,0 @@ -use dyn_any::DynAny; -use graphene_core::Color; -use std::borrow::Cow; -use std::fmt::Debug; -use std::sync::atomic::{AtomicBool, Ordering}; -use std::sync::{Arc, Mutex}; - -#[derive(Default, Debug, Clone, DynAny, specta::Type, serde::Serialize, serde::Deserialize)] -pub struct ImaginateCache(Arc>>); - -impl ImaginateCache { - pub fn into_inner(self) -> Arc>> { - self.0 - } -} - -impl std::cmp::PartialEq for ImaginateCache { - fn eq(&self, other: &Self) -> bool { - Arc::ptr_eq(&self.0, &other.0) - } -} - -impl core::hash::Hash for ImaginateCache { - fn hash(&self, state: &mut H) { - let _ = self.0.try_lock().map(|g| g.hash(state)).map_err(|_| "error".hash(state)); - } -} - -pub trait ImaginateTerminationHandle: Debug + Send + 'static { - fn terminate(&self); -} - -#[derive(Default, Debug, specta::Type, serde::Serialize, serde::Deserialize)] -struct InternalImaginateControl { - #[serde(skip)] - status: Mutex, - trigger_regenerate: AtomicBool, - #[serde(skip)] - #[specta(skip)] - termination_sender: Mutex>>, -} - -#[derive(Debug, Default, Clone, DynAny, specta::Type, serde::Serialize, serde::Deserialize)] -pub struct ImaginateController(Arc); - -impl ImaginateController { - pub fn get_status(&self) -> ImaginateStatus { - self.0.status.try_lock().as_deref().cloned().unwrap_or_default() - } - - pub fn set_status(&self, status: ImaginateStatus) { - if let Ok(mut lock) = self.0.status.try_lock() { - *lock = status - } - } - - pub fn take_regenerate_trigger(&self) -> bool { - self.0.trigger_regenerate.swap(false, Ordering::SeqCst) - } - - pub fn trigger_regenerate(&self) { - self.0.trigger_regenerate.store(true, Ordering::SeqCst) - } - - pub fn request_termination(&self) { - if let Some(handle) = self.0.termination_sender.try_lock().ok().and_then(|mut lock| lock.take()) { - handle.terminate() - } - } - - pub fn set_termination_handle(&self, handle: Box) { - if let Ok(mut lock) = self.0.termination_sender.try_lock() { - *lock = Some(handle) - } - } -} - -impl std::cmp::PartialEq for ImaginateController { - fn eq(&self, other: &Self) -> bool { - Arc::ptr_eq(&self.0, &other.0) - } -} - -impl core::hash::Hash for ImaginateController { - fn hash(&self, state: &mut H) { - core::ptr::hash(Arc::as_ptr(&self.0), state) - } -} - -#[derive(Default, Debug, Clone, PartialEq, DynAny, specta::Type, serde::Serialize, serde::Deserialize)] -pub enum ImaginateStatus { - #[default] - Ready, - ReadyDone, - Beginning, - Uploading, - Generating(f64), - Terminating, - Terminated, - Failed(String), -} - -impl ImaginateStatus { - pub fn to_text(&self) -> Cow<'static, str> { - match self { - Self::Ready => Cow::Borrowed("Ready"), - Self::ReadyDone => Cow::Borrowed("Done"), - Self::Beginning => Cow::Borrowed("Beginning…"), - Self::Uploading => Cow::Borrowed("Downloading Image…"), - Self::Generating(percent) => Cow::Owned(format!("Generating {percent:.0}%")), - Self::Terminating => Cow::Owned("Terminating…".to_string()), - Self::Terminated => Cow::Owned("Terminated".to_string()), - Self::Failed(err) => Cow::Owned(format!("Failed: {err}")), - } - } -} - -#[allow(clippy::derived_hash_with_manual_eq)] -impl core::hash::Hash for ImaginateStatus { - fn hash(&self, state: &mut H) { - core::mem::discriminant(self).hash(state); - match self { - Self::Ready | Self::ReadyDone | Self::Beginning | Self::Uploading | Self::Terminating | Self::Terminated => (), - Self::Generating(f) => f.to_bits().hash(state), - Self::Failed(err) => err.hash(state), - } - } -} - -#[derive(PartialEq, Eq, Clone, Default, Debug)] -pub enum ImaginateServerStatus { - #[default] - Unknown, - Checking, - Connected, - Failed(String), - Unavailable, -} - -impl ImaginateServerStatus { - pub fn to_text(&self) -> Cow<'static, str> { - match self { - Self::Unknown | Self::Checking => Cow::Borrowed("Checking..."), - Self::Connected => Cow::Borrowed("Connected"), - Self::Failed(err) => Cow::Owned(err.clone()), - Self::Unavailable => Cow::Borrowed("Unavailable"), - } - } -} - -#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, specta::Type, Hash, serde::Serialize, serde::Deserialize)] -pub enum ImaginateMaskPaintMode { - #[default] - Inpaint, - Outpaint, -} - -#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, DynAny, specta::Type, Hash, serde::Serialize, serde::Deserialize)] -pub enum ImaginateMaskStartingFill { - #[default] - Fill, - Original, - LatentNoise, - LatentNothing, -} - -impl ImaginateMaskStartingFill { - pub fn list() -> [ImaginateMaskStartingFill; 4] { - [ - ImaginateMaskStartingFill::Fill, - ImaginateMaskStartingFill::Original, - ImaginateMaskStartingFill::LatentNoise, - ImaginateMaskStartingFill::LatentNothing, - ] - } -} - -impl std::fmt::Display for ImaginateMaskStartingFill { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - ImaginateMaskStartingFill::Fill => write!(f, "Smeared Surroundings"), - ImaginateMaskStartingFill::Original => write!(f, "Original Input Image"), - ImaginateMaskStartingFill::LatentNoise => write!(f, "Randomness (Latent Noise)"), - ImaginateMaskStartingFill::LatentNothing => write!(f, "Neutral (Latent Nothing)"), - } - } -} - -#[derive(Debug, Default, Copy, Clone, Eq, PartialEq, DynAny, specta::Type, Hash, serde::Serialize, serde::Deserialize)] -pub enum ImaginateSamplingMethod { - #[default] - EulerA, - Euler, - LMS, - Heun, - DPM2, - DPM2A, - DPMPlusPlus2sA, - DPMPlusPlus2m, - DPMFast, - DPMAdaptive, - LMSKarras, - DPM2Karras, - DPM2AKarras, - DPMPlusPlus2sAKarras, - DPMPlusPlus2mKarras, - DDIM, - PLMS, -} - -impl ImaginateSamplingMethod { - pub fn api_value(&self) -> &str { - match self { - ImaginateSamplingMethod::EulerA => "Euler a", - ImaginateSamplingMethod::Euler => "Euler", - ImaginateSamplingMethod::LMS => "LMS", - ImaginateSamplingMethod::Heun => "Heun", - ImaginateSamplingMethod::DPM2 => "DPM2", - ImaginateSamplingMethod::DPM2A => "DPM2 a", - ImaginateSamplingMethod::DPMPlusPlus2sA => "DPM++ 2S a", - ImaginateSamplingMethod::DPMPlusPlus2m => "DPM++ 2M", - ImaginateSamplingMethod::DPMFast => "DPM fast", - ImaginateSamplingMethod::DPMAdaptive => "DPM adaptive", - ImaginateSamplingMethod::LMSKarras => "LMS Karras", - ImaginateSamplingMethod::DPM2Karras => "DPM2 Karras", - ImaginateSamplingMethod::DPM2AKarras => "DPM2 a Karras", - ImaginateSamplingMethod::DPMPlusPlus2sAKarras => "DPM++ 2S a Karras", - ImaginateSamplingMethod::DPMPlusPlus2mKarras => "DPM++ 2M Karras", - ImaginateSamplingMethod::DDIM => "DDIM", - ImaginateSamplingMethod::PLMS => "PLMS", - } - } - - pub fn list() -> [ImaginateSamplingMethod; 17] { - [ - ImaginateSamplingMethod::EulerA, - ImaginateSamplingMethod::Euler, - ImaginateSamplingMethod::LMS, - ImaginateSamplingMethod::Heun, - ImaginateSamplingMethod::DPM2, - ImaginateSamplingMethod::DPM2A, - ImaginateSamplingMethod::DPMPlusPlus2sA, - ImaginateSamplingMethod::DPMPlusPlus2m, - ImaginateSamplingMethod::DPMFast, - ImaginateSamplingMethod::DPMAdaptive, - ImaginateSamplingMethod::LMSKarras, - ImaginateSamplingMethod::DPM2Karras, - ImaginateSamplingMethod::DPM2AKarras, - ImaginateSamplingMethod::DPMPlusPlus2sAKarras, - ImaginateSamplingMethod::DPMPlusPlus2mKarras, - ImaginateSamplingMethod::DDIM, - ImaginateSamplingMethod::PLMS, - ] - } -} - -impl std::fmt::Display for ImaginateSamplingMethod { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - ImaginateSamplingMethod::EulerA => write!(f, "Euler A (Recommended)"), - ImaginateSamplingMethod::Euler => write!(f, "Euler"), - ImaginateSamplingMethod::LMS => write!(f, "LMS"), - ImaginateSamplingMethod::Heun => write!(f, "Heun"), - ImaginateSamplingMethod::DPM2 => write!(f, "DPM2"), - ImaginateSamplingMethod::DPM2A => write!(f, "DPM2 A"), - ImaginateSamplingMethod::DPMPlusPlus2sA => write!(f, "DPM++ 2S a"), - ImaginateSamplingMethod::DPMPlusPlus2m => write!(f, "DPM++ 2M"), - ImaginateSamplingMethod::DPMFast => write!(f, "DPM Fast"), - ImaginateSamplingMethod::DPMAdaptive => write!(f, "DPM Adaptive"), - ImaginateSamplingMethod::LMSKarras => write!(f, "LMS Karras"), - ImaginateSamplingMethod::DPM2Karras => write!(f, "DPM2 Karras"), - ImaginateSamplingMethod::DPM2AKarras => write!(f, "DPM2 A Karras"), - ImaginateSamplingMethod::DPMPlusPlus2sAKarras => write!(f, "DPM++ 2S a Karras"), - ImaginateSamplingMethod::DPMPlusPlus2mKarras => write!(f, "DPM++ 2M Karras"), - ImaginateSamplingMethod::DDIM => write!(f, "DDIM"), - ImaginateSamplingMethod::PLMS => write!(f, "PLMS"), - } - } -} diff --git a/node-graph/graph-craft/src/wasm_application_io.rs b/node-graph/graph-craft/src/wasm_application_io.rs index f9657bf098..1d11744aa4 100644 --- a/node-graph/graph-craft/src/wasm_application_io.rs +++ b/node-graph/graph-craft/src/wasm_application_io.rs @@ -317,14 +317,10 @@ pub type WasmSurfaceHandleFrame = graphene_application_io::SurfaceHandleFrame &str { - // &self.imaginate_hostname - // } fn use_vello(&self) -> bool { self.use_vello } @@ -333,7 +329,6 @@ impl graphene_application_io::GetEditorPreferences for EditorPreferences { impl Default for EditorPreferences { fn default() -> Self { Self { - // imaginate_hostname: "http://localhost:7860/".into(), #[cfg(target_arch = "wasm32")] use_vello: false, #[cfg(not(target_arch = "wasm32"))] diff --git a/node-graph/gstd/Cargo.toml b/node-graph/gstd/Cargo.toml index 6d440e85e5..728674a5bf 100644 --- a/node-graph/gstd/Cargo.toml +++ b/node-graph/gstd/Cargo.toml @@ -7,11 +7,16 @@ authors = ["Graphite Authors "] license = "MIT OR Apache-2.0" [features] -default = ["wasm", "imaginate"] +default = ["wasm"] gpu = [] wgpu = ["gpu", "graph-craft/wgpu", "graphene-application-io/wgpu"] -wasm = ["wasm-bindgen", "web-sys", "graphene-application-io/wasm"] -imaginate = ["image/png", "base64", "web-sys", "wasm-bindgen-futures"] +wasm = [ + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "graphene-application-io/wasm", + "image/png", +] image-compare = [] vello = ["dep:vello", "gpu", "graphene-core/vello"] resvg = [] @@ -39,9 +44,9 @@ rand_chacha = { workspace = true } rand = { workspace = true } bytemuck = { workspace = true } image = { workspace = true } +base64 = { workspace = true } # Optional workspace dependencies -base64 = { workspace = true, optional = true } wasm-bindgen = { workspace = true, optional = true } wasm-bindgen-futures = { workspace = true, optional = true } tokio = { workspace = true, optional = true } @@ -58,7 +63,7 @@ web-sys = { workspace = true, optional = true, features = [ "ImageBitmapRenderingContext", ] } -# Optional dependencies +# Required dependencies ndarray = "0.16.1" [dev-dependencies] diff --git a/node-graph/gstd/src/imaginate.rs b/node-graph/gstd/src/imaginate.rs deleted file mode 100644 index 40ad1c7fee..0000000000 --- a/node-graph/gstd/src/imaginate.rs +++ /dev/null @@ -1,526 +0,0 @@ -use crate::wasm_application_io::WasmEditorApi; -use core::any::TypeId; -use core::future::Future; -use futures::TryFutureExt; -use futures::future::Either; -use glam::{DVec2, U64Vec2}; -use graph_craft::imaginate_input::{ImaginateController, ImaginateMaskStartingFill, ImaginateSamplingMethod, ImaginateServerStatus, ImaginateStatus, ImaginateTerminationHandle}; -use graph_craft::wasm_application_io::EditorPreferences; -use graphene_core::application_io::NodeGraphUpdateMessage; -use graphene_core::raster::{Color, Image, Luma, Pixel}; -use image::{DynamicImage, ImageBuffer, ImageFormat}; -use reqwest::Url; - -const PROGRESS_EVERY_N_STEPS: u32 = 5; -const SDAPI_TEXT_TO_IMAGE: &str = "sdapi/v1/txt2img"; -const SDAPI_IMAGE_TO_IMAGE: &str = "sdapi/v1/img2img"; -const SDAPI_PROGRESS: &str = "sdapi/v1/progress?skip_current_image=true"; -const SDAPI_TERMINATE: &str = "sdapi/v1/interrupt"; - -fn new_client() -> Result { - reqwest::ClientBuilder::new().build().map_err(Error::ClientBuild) -} - -fn parse_url(url: &str) -> Result { - url.try_into().map_err(|err| Error::UrlParse { text: url.into(), err }) -} - -fn join_url(base_url: &Url, path: &str) -> Result { - base_url.join(path).map_err(|err| Error::UrlParse { text: base_url.to_string(), err }) -} - -fn new_get_request(client: &reqwest::Client, url: U) -> Result { - client.get(url).header("Accept", "*/*").build().map_err(Error::RequestBuild) -} - -pub struct ImaginatePersistentData { - pending_server_check: Option>>, - host_name: Url, - client: Option, - server_status: ImaginateServerStatus, -} - -impl core::fmt::Debug for ImaginatePersistentData { - fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { - f.debug_struct(core::any::type_name::()) - .field("pending_server_check", &self.pending_server_check.is_some()) - .field("host_name", &self.host_name) - .field("status", &self.server_status) - .finish() - } -} - -impl Default for ImaginatePersistentData { - fn default() -> Self { - let server_status = ImaginateServerStatus::default(); - #[cfg(not(miri))] - let mut server_status = server_status; - #[cfg(not(miri))] - let client = new_client().map_err(|err| server_status = ImaginateServerStatus::Failed(err.to_string())).ok(); - #[cfg(miri)] - let client = None; - let EditorPreferences { imaginate_hostname: host_name, .. } = Default::default(); - Self { - pending_server_check: None, - host_name: parse_url(&host_name).unwrap(), - client, - server_status, - } - } -} - -type ImaginateFuture = core::pin::Pin + 'static>>; - -impl ImaginatePersistentData { - pub fn set_host_name(&mut self, name: &str) { - match parse_url(name) { - Ok(url) => self.host_name = url, - Err(err) => self.server_status = ImaginateServerStatus::Failed(err.to_string()), - } - } - - fn initiate_server_check_maybe_fail(&mut self) -> Result, Error> { - use futures::future::FutureExt; - let Some(client) = &self.client else { - return Ok(None); - }; - if self.pending_server_check.is_some() { - return Ok(None); - } - self.server_status = ImaginateServerStatus::Checking; - let url = join_url(&self.host_name, SDAPI_PROGRESS)?; - let request = new_get_request(client, url)?; - let (send, recv) = futures::channel::oneshot::channel(); - let response_future = client.execute(request).map(move |r| { - let _ = send.send(r); - }); - self.pending_server_check = Some(recv); - Ok(Some(Box::pin(response_future))) - } - - pub fn initiate_server_check(&mut self) -> Option { - match self.initiate_server_check_maybe_fail() { - Ok(f) => f, - Err(err) => { - self.server_status = ImaginateServerStatus::Failed(err.to_string()); - None - } - } - } - - pub fn poll_server_check(&mut self) { - if let Some(mut check) = self.pending_server_check.take() { - self.server_status = match check.try_recv().map(|r| r.map(|r| r.and_then(reqwest::Response::error_for_status))) { - Ok(Some(Ok(_response))) => ImaginateServerStatus::Connected, - Ok(Some(Err(_))) | Err(_) => ImaginateServerStatus::Unavailable, - Ok(None) => { - self.pending_server_check = Some(check); - ImaginateServerStatus::Checking - } - } - } - } - - pub fn server_status(&self) -> &ImaginateServerStatus { - &self.server_status - } - - pub fn is_checking(&self) -> bool { - matches!(self.server_status, ImaginateServerStatus::Checking) - } -} - -#[derive(Debug)] -struct ImaginateFutureAbortHandle(futures::future::AbortHandle); - -impl ImaginateTerminationHandle for ImaginateFutureAbortHandle { - fn terminate(&self) { - self.0.abort() - } -} - -#[derive(Debug)] -enum Error { - UrlParse { text: String, err: <&'static str as TryInto>::Error }, - ClientBuild(reqwest::Error), - RequestBuild(reqwest::Error), - Request(reqwest::Error), - ResponseFormat(reqwest::Error), - NoImage, - Base64Decode(base64::DecodeError), - ImageDecode(image::error::ImageError), - ImageEncode(image::error::ImageError), - UnsupportedPixelType(&'static str), - InconsistentImageSize, - Terminated, - TerminationFailed(reqwest::Error), -} - -impl core::fmt::Display for Error { - fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result { - match self { - Self::UrlParse { text, err } => write!(f, "invalid url '{text}' ({err})"), - Self::ClientBuild(err) => write!(f, "failed to create a reqwest client ({err})"), - Self::RequestBuild(err) => write!(f, "failed to create a reqwest request ({err})"), - Self::Request(err) => write!(f, "request failed ({err})"), - Self::ResponseFormat(err) => write!(f, "got an invalid API response ({err})"), - Self::NoImage => write!(f, "got an empty API response"), - Self::Base64Decode(err) => write!(f, "failed to decode base64 encoded image ({err})"), - Self::ImageDecode(err) => write!(f, "failed to decode png image ({err})"), - Self::ImageEncode(err) => write!(f, "failed to encode png image ({err})"), - Self::UnsupportedPixelType(ty) => write!(f, "pixel type `{ty}` not supported for imaginate images"), - Self::InconsistentImageSize => write!(f, "image width and height do not match the image byte size"), - Self::Terminated => write!(f, "imaginate request was terminated by the user"), - Self::TerminationFailed(err) => write!(f, "termination failed ({err})"), - } - } -} - -impl std::error::Error for Error {} - -#[derive(Default, Debug, Clone, serde::Deserialize)] -struct ImageResponse { - images: Vec, -} - -#[derive(Default, Debug, Clone, serde::Deserialize)] -struct ProgressResponse { - progress: f64, -} - -#[derive(Debug, Clone, Copy, serde::Serialize)] -struct ImaginateTextToImageRequestOverrideSettings { - show_progress_every_n_steps: u32, -} - -impl Default for ImaginateTextToImageRequestOverrideSettings { - fn default() -> Self { - Self { - show_progress_every_n_steps: PROGRESS_EVERY_N_STEPS, - } - } -} - -#[derive(Debug, Clone, Copy, serde::Serialize)] -struct ImaginateImageToImageRequestOverrideSettings { - show_progress_every_n_steps: u32, - img2img_fix_steps: bool, -} - -impl Default for ImaginateImageToImageRequestOverrideSettings { - fn default() -> Self { - Self { - show_progress_every_n_steps: PROGRESS_EVERY_N_STEPS, - img2img_fix_steps: true, - } - } -} - -#[derive(Debug, Clone, serde::Serialize)] -struct ImaginateTextToImageRequest<'a> { - #[serde(flatten)] - common: ImaginateCommonImageRequest<'a>, - override_settings: ImaginateTextToImageRequestOverrideSettings, -} - -#[derive(Debug, Clone, serde::Serialize)] -struct ImaginateMask { - mask: String, - mask_blur: String, - inpainting_fill: u32, - inpaint_full_res: bool, - inpainting_mask_invert: u32, -} - -#[derive(Debug, Clone, serde::Serialize)] -struct ImaginateImageToImageRequest<'a> { - #[serde(flatten)] - common: ImaginateCommonImageRequest<'a>, - override_settings: ImaginateImageToImageRequestOverrideSettings, - - init_images: Vec, - denoising_strength: f64, - #[serde(flatten)] - mask: Option, -} - -#[derive(Debug, Clone, serde::Serialize)] -struct ImaginateCommonImageRequest<'a> { - prompt: String, - seed: f64, - steps: u32, - cfg_scale: f64, - width: f64, - height: f64, - restore_faces: bool, - tiling: bool, - negative_prompt: String, - sampler_index: &'a str, -} - -#[cfg(all(feature = "imaginate", feature = "serde"))] -#[allow(clippy::too_many_arguments)] -pub async fn imaginate<'a, P: Pixel>( - image: Image

, - editor_api: impl Future, - controller: ImaginateController, - seed: impl Future, - res: impl Future>, - samples: impl Future, - sampling_method: impl Future, - prompt_guidance: impl Future, - prompt: impl Future, - negative_prompt: impl Future, - adapt_input_image: impl Future, - image_creativity: impl Future, - inpaint: impl Future, - mask_blur: impl Future, - mask_starting_fill: impl Future, - improve_faces: impl Future, - tiling: impl Future, -) -> Image

{ - let WasmEditorApi { - node_graph_message_sender, - editor_preferences, - .. - } = editor_api.await; - let set_progress = |progress: ImaginateStatus| { - controller.set_status(progress); - node_graph_message_sender.send(NodeGraphUpdateMessage::ImaginateStatusUpdate); - }; - let host_name = editor_preferences.hostname(); - imaginate_maybe_fail( - image, - host_name, - set_progress, - &controller, - seed, - res, - samples, - sampling_method, - prompt_guidance, - prompt, - negative_prompt, - adapt_input_image, - image_creativity, - inpaint, - mask_blur, - mask_starting_fill, - improve_faces, - tiling, - ) - .await - .unwrap_or_else(|err| { - match err { - Error::Terminated => { - set_progress(ImaginateStatus::Terminated); - } - err => { - error!("{err}"); - set_progress(ImaginateStatus::Failed(err.to_string())); - } - }; - Image::default() - }) -} - -#[cfg(all(feature = "imaginate", feature = "serde"))] -#[allow(clippy::too_many_arguments)] -async fn imaginate_maybe_fail( - image: Image

, - host_name: &str, - set_progress: F, - controller: &ImaginateController, - seed: impl Future, - res: impl Future>, - samples: impl Future, - sampling_method: impl Future, - prompt_guidance: impl Future, - prompt: impl Future, - negative_prompt: impl Future, - adapt_input_image: impl Future, - image_creativity: impl Future, - _inpaint: impl Future, - _mask_blur: impl Future, - _mask_starting_fill: impl Future, - improve_faces: impl Future, - tiling: impl Future, -) -> Result, Error> { - set_progress(ImaginateStatus::Beginning); - - let base_url: Url = parse_url(host_name)?; - - let client = new_client()?; - - let sampler_index = sampling_method.await; - let sampler_index = sampler_index.api_value(); - - let res = res.await.unwrap_or_else(|| { - let (width, height) = pick_safe_imaginate_resolution((image.width as _, image.height as _)); - DVec2::new(width as _, height as _) - }); - let common_request_data = ImaginateCommonImageRequest { - prompt: prompt.await, - seed: seed.await, - steps: samples.await, - cfg_scale: prompt_guidance.await, - width: res.x, - height: res.y, - restore_faces: improve_faces.await, - tiling: tiling.await, - negative_prompt: negative_prompt.await, - sampler_index, - }; - let request_builder = if adapt_input_image.await { - let base64_data = image_to_base64(image)?; - let request_data = ImaginateImageToImageRequest { - common: common_request_data, - override_settings: Default::default(), - - init_images: vec![base64_data], - denoising_strength: image_creativity.await * 0.01, - mask: None, - }; - let url = join_url(&base_url, SDAPI_IMAGE_TO_IMAGE)?; - client.post(url).json(&request_data) - } else { - let request_data = ImaginateTextToImageRequest { - common: common_request_data, - override_settings: Default::default(), - }; - let url = join_url(&base_url, SDAPI_TEXT_TO_IMAGE)?; - client.post(url).json(&request_data) - }; - - let request = request_builder.header("Accept", "*/*").build().map_err(Error::RequestBuild)?; - - let (response_future, abort_handle) = futures::future::abortable(client.execute(request)); - controller.set_termination_handle(Box::new(ImaginateFutureAbortHandle(abort_handle))); - - let progress_url = join_url(&base_url, SDAPI_PROGRESS)?; - - futures::pin_mut!(response_future); - - let response = loop { - let progress_request = new_get_request(&client, progress_url.clone())?; - let progress_response_future = client.execute(progress_request).and_then(|response| response.json()); - - futures::pin_mut!(progress_response_future); - - response_future = match futures::future::select(response_future, progress_response_future).await { - Either::Left((response, _)) => break response, - Either::Right((progress, response_future)) => { - if let Ok(ProgressResponse { progress }) = progress { - set_progress(ImaginateStatus::Generating(progress * 100.)); - } - response_future - } - }; - }; - - let response = match response { - Ok(response) => response.and_then(reqwest::Response::error_for_status).map_err(Error::Request)?, - Err(_aborted) => { - set_progress(ImaginateStatus::Terminating); - let url = join_url(&base_url, SDAPI_TERMINATE)?; - let request = client.post(url).build().map_err(Error::RequestBuild)?; - // The user probably doesn't really care if the server side was really aborted or if there was an network error. - // So we fool them that the request was terminated if the termination request in reality failed. - let _ = client.execute(request).await.and_then(reqwest::Response::error_for_status).map_err(Error::TerminationFailed)?; - return Err(Error::Terminated); - } - }; - - set_progress(ImaginateStatus::Uploading); - - let ImageResponse { images } = response.json().await.map_err(Error::ResponseFormat)?; - - let result = images.into_iter().next().ok_or(Error::NoImage).and_then(base64_to_image)?; - - set_progress(ImaginateStatus::ReadyDone); - - Ok(result) -} - -fn image_to_base64(image: Image

) -> Result { - use base64::prelude::*; - - let Image { width, height, data, .. } = image; - - fn cast_with_f32>(data: Vec, width: u32, height: u32) -> Result - where - DynamicImage: From>>, - { - ImageBuffer::>::from_raw(width, height, bytemuck::cast_vec(data)) - .ok_or(Error::InconsistentImageSize) - .map(Into::into) - } - - let image: DynamicImage = match TypeId::of::

() { - id if id == TypeId::of::() => cast_with_f32::<_, image::Rgba>(data, width, height)? - // we need to do this cast, because png does not support rgba32f - .to_rgba16().into(), - id if id == TypeId::of::() => cast_with_f32::<_, image::Luma>(data, width, height)? - // we need to do this cast, because png does not support luma32f - .to_luma16().into(), - _ => return Err(Error::UnsupportedPixelType(core::any::type_name::

())), - }; - - let mut png_data = std::io::Cursor::new(vec![]); - image.write_to(&mut png_data, ImageFormat::Png).map_err(Error::ImageEncode)?; - Ok(BASE64_STANDARD.encode(png_data.into_inner())) -} - -fn base64_to_image, P: Pixel>(base64_data: D) -> Result, Error> { - use base64::prelude::*; - - let png_data = BASE64_STANDARD.decode(base64_data).map_err(Error::Base64Decode)?; - let dyn_image = image::load_from_memory_with_format(&png_data, image::ImageFormat::Png).map_err(Error::ImageDecode)?; - let (width, height) = (dyn_image.width(), dyn_image.height()); - - let result_data: Vec

= match TypeId::of::

() { - id if id == TypeId::of::() => bytemuck::cast_vec(dyn_image.into_rgba32f().into_raw()), - id if id == TypeId::of::() => bytemuck::cast_vec(dyn_image.to_luma32f().into_raw()), - _ => return Err(Error::UnsupportedPixelType(core::any::type_name::

())), - }; - - Ok(Image { - data: result_data, - width, - height, - base64_string: None, - }) -} - -pub fn pick_safe_imaginate_resolution((width, height): (f64, f64)) -> (u64, u64) { - const NATIVE_MODEL_RESOLUTION: f64 = 512.; - let size = if width * height == 0. { DVec2::splat(NATIVE_MODEL_RESOLUTION) } else { DVec2::new(width, height) }; - - const MAX_RESOLUTION: u64 = 1000 * 1000; - - // This is the maximum width/height that can be obtained - const MAX_DIMENSION: u64 = (MAX_RESOLUTION / 64) & !63; - - // Round the resolution to the nearest multiple of 64 - let size = (size.round().clamp(DVec2::ZERO, DVec2::splat(MAX_DIMENSION as _)).as_u64vec2() + U64Vec2::splat(32)).max(U64Vec2::splat(64)) & !U64Vec2::splat(63); - let resolution = size.x * size.y; - - if resolution > MAX_RESOLUTION { - // Scale down the image, so it is smaller than MAX_RESOLUTION - let scale = (MAX_RESOLUTION as f64 / resolution as f64).sqrt(); - let size = size.as_dvec2() * scale; - - if size.x < 64. { - // The image is extremely wide - (64, MAX_DIMENSION) - } else if size.y < 64. { - // The image is extremely high - (MAX_DIMENSION, 64) - } else { - // Round down to a multiple of 64, so that the resolution still is smaller than MAX_RESOLUTION - (size.as_u64vec2() & !U64Vec2::splat(63)).into() - } - } else { - size.into() - } -} diff --git a/node-graph/gstd/src/raster.rs b/node-graph/gstd/src/raster.rs index 94c045dfe5..a3dfc77076 100644 --- a/node-graph/gstd/src/raster.rs +++ b/node-graph/gstd/src/raster.rs @@ -305,103 +305,6 @@ fn image_value(_: impl Ctx, _primary: (), image: RasterDataTable) -> Raster image } -// macro_rules! generate_imaginate_node { -// ($($val:ident: $t:ident: $o:ty,)*) => { -// pub struct ImaginateNode { -// editor_api: E, -// controller: C, -// generation_id: G, -// $($val: $t,)* -// cache: std::sync::Arc>>>, -// last_generation: std::sync::atomic::AtomicU64, -// } - -// impl<'e, P: Pixel, E, C, G, $($t,)*> ImaginateNode -// where $($t: for<'any_input> Node<'any_input, (), Output = DynFuture<'any_input, $o>>,)* -// E: for<'any_input> Node<'any_input, (), Output = DynFuture<'any_input, &'e WasmEditorApi>>, -// C: for<'any_input> Node<'any_input, (), Output = DynFuture<'any_input, ImaginateController>>, -// G: for<'any_input> Node<'any_input, (), Output = DynFuture<'any_input, u64>>, -// { -// #[allow(clippy::too_many_arguments)] -// pub fn new(editor_api: E, controller: C, $($val: $t,)* generation_id: G ) -> Self { -// Self { editor_api, controller, generation_id, $($val,)* cache: Default::default(), last_generation: std::sync::atomic::AtomicU64::new(u64::MAX) } -// } -// } - -// impl<'i, 'e: 'i, P: Pixel + 'i + Hash + Default + Send, E: 'i, C: 'i, G: 'i, $($t: 'i,)*> Node<'i, RasterData

> for ImaginateNode -// where $($t: for<'any_input> Node<'any_input, (), Output = DynFuture<'any_input, $o>>,)* -// E: for<'any_input> Node<'any_input, (), Output = DynFuture<'any_input, &'e WasmEditorApi>>, -// C: for<'any_input> Node<'any_input, (), Output = DynFuture<'any_input, ImaginateController>>, -// G: for<'any_input> Node<'any_input, (), Output = DynFuture<'any_input, u64>>, -// { -// type Output = DynFuture<'i, RasterData

>; - -// fn eval(&'i self, frame: RasterData

) -> Self::Output { -// let controller = self.controller.eval(()); -// $(let $val = self.$val.eval(());)* - -// use std::hash::Hasher; -// let mut hasher = rustc_hash::FxHasher::default(); -// frame.image.hash(&mut hasher); -// let hash = hasher.finish(); -// let editor_api = self.editor_api.eval(()); -// let cache = self.cache.clone(); -// let generation_future = self.generation_id.eval(()); -// let last_generation = &self.last_generation; - -// Box::pin(async move { -// let controller: ImaginateController = controller.await; -// let generation_id = generation_future.await; -// if generation_id != last_generation.swap(generation_id, std::sync::atomic::Ordering::SeqCst) { -// let image = super::imaginate::imaginate(frame.image, editor_api, controller, $($val,)*).await; - -// cache.lock().unwrap().insert(hash, image.clone()); - -// return wrap_image_frame(image, frame.transform); -// } -// let image = cache.lock().unwrap().get(&hash).cloned().unwrap_or_default(); - -// return wrap_image_frame(image, frame.transform); -// }) -// } -// } -// } -// } - -// fn wrap_image_frame(image: Image

, transform: DAffine2) -> RasterData

{ -// if !transform.decompose_scale().abs_diff_eq(DVec2::ZERO, 0.00001) { -// RasterData { -// image, -// transform, -// alpha_blending: AlphaBlending::default(), -// } -// } else { -// let resolution = DVec2::new(image.height as f64, image.width as f64); -// RasterData { -// image, -// transform: DAffine2::from_scale_angle_translation(resolution, 0., transform.translation), -// alpha_blending: AlphaBlending::default(), -// } -// } -// } - -// generate_imaginate_node! { -// seed: Seed: f64, -// res: Res: Option, -// samples: Samples: u32, -// sampling_method: SamplingMethod: ImaginateSamplingMethod, -// prompt_guidance: PromptGuidance: f64, -// prompt: Prompt: String, -// negative_prompt: NegativePrompt: String, -// adapt_input_image: AdaptInputImage: bool, -// image_creativity: ImageCreativity: f64, -// inpaint: Inpaint: bool, -// mask_blur: MaskBlur: f64, -// mask_starting_fill: MaskStartingFill: ImaginateMaskStartingFill, -// improve_faces: ImproveFaces: bool, -// tiling: Tiling: bool, -// } - #[node_macro::node(category("Raster: Pattern"))] #[allow(clippy::too_many_arguments)] fn noise_pattern( diff --git a/website/content/features.md b/website/content/features.md index 4966850baa..307e8bbc17 100644 --- a/website/content/features.md +++ b/website/content/features.md @@ -117,10 +117,6 @@ Always on the bleeding edge and built to last— Graphite is written on a robust Procedural vector editing and usability

-

— Alpha 4 —

@@ -209,6 +205,10 @@ Always on the bleeding edge and built to last— Graphite is written on a robust Stable document format
+

— Beta —

diff --git a/website/content/learn/introduction/features-and-limitations.md b/website/content/learn/introduction/features-and-limitations.md index f409fba02a..ee2accdb10 100644 --- a/website/content/learn/introduction/features-and-limitations.md +++ b/website/content/learn/introduction/features-and-limitations.md @@ -57,8 +57,6 @@ Raster image editing is a growing capability that will develop over time into th A prototype Brush tool exists letting you draw simple doodles and sketches. However it is very limited in its capabilities and there are multiple bugs and performance issues with the feature. It can be used in a basic capacity, but don't expect to paint anything too impressive using raster brushes quite yet. The tool will be fully rewritten in the future. - - ## Status and limitations Please make yourself aware of these factors to better understand and work around the rough edges in today's Graphite editor. diff --git a/website/content/volunteer/guide/codebase-overview/_index.md b/website/content/volunteer/guide/codebase-overview/_index.md index d5017847aa..c28ac7821c 100644 --- a/website/content/volunteer/guide/codebase-overview/_index.md +++ b/website/content/volunteer/guide/codebase-overview/_index.md @@ -163,7 +163,6 @@ messages │   │   ├── fill_tool.rs │   │   ├── freehand_tool.rs │   │   ├── gradient_tool.rs -│   │   ├── imaginate_tool.rs │   │   ├── line_tool.rs │   │   ├── navigate_tool.rs │   │   ├── path_tool.rs From d8d2a51926cab6af98c52f3c55beac5b6e9bf928 Mon Sep 17 00:00:00 2001 From: 0SlowPoke0 <142654792+0SlowPoke0@users.noreply.github.com> Date: Fri, 27 Jun 2025 11:04:36 +0530 Subject: [PATCH 25/44] Refactor shape gizmo interactivity to support future shape tools (#2748) * impl GizmoHandlerTrait,Gizmo-manager and add comments * Code review --------- Co-authored-by: Keavon Chambers --- editor/src/consts.rs | 4 +- .../document/document_message_handler.rs | 8 +- .../gizmos/gizmo_manager.rs | 246 ++++++++++++ .../tool/common_functionality/gizmos/mod.rs | 2 + .../gizmos/shape_gizmos/mod.rs | 2 + .../shape_gizmos/number_of_points_dial.rs | 209 ++++++++++ .../shape_gizmos/point_radius_handle.rs | 362 +++++++++--------- .../messages/tool/common_functionality/mod.rs | 2 +- .../common_functionality/shape_gizmos/mod.rs | 2 - .../shape_gizmos/number_of_points_handle.rs | 241 ------------ .../shapes/polygon_shape.rs | 83 ++++ .../shapes/shape_utility.rs | 131 ++++--- .../common_functionality/shapes/star_shape.rs | 80 ++++ .../tool/tool_messages/freehand_tool.rs | 18 +- .../tool/tool_messages/gradient_tool.rs | 12 +- .../messages/tool/tool_messages/shape_tool.rs | 159 +++----- .../tool/tool_messages/spline_tool.rs | 42 +- .../transform_layer_message_handler.rs | 8 +- .../gcore/src/vector/generator_nodes.rs | 8 +- 19 files changed, 1000 insertions(+), 619 deletions(-) create mode 100644 editor/src/messages/tool/common_functionality/gizmos/gizmo_manager.rs create mode 100644 editor/src/messages/tool/common_functionality/gizmos/mod.rs create mode 100644 editor/src/messages/tool/common_functionality/gizmos/shape_gizmos/mod.rs create mode 100644 editor/src/messages/tool/common_functionality/gizmos/shape_gizmos/number_of_points_dial.rs rename editor/src/messages/tool/common_functionality/{ => gizmos}/shape_gizmos/point_radius_handle.rs (54%) delete mode 100644 editor/src/messages/tool/common_functionality/shape_gizmos/mod.rs delete mode 100644 editor/src/messages/tool/common_functionality/shape_gizmos/number_of_points_handle.rs diff --git a/editor/src/consts.rs b/editor/src/consts.rs index 19edd48afd..c943efe24b 100644 --- a/editor/src/consts.rs +++ b/editor/src/consts.rs @@ -122,8 +122,8 @@ pub const DEFAULT_BRUSH_SIZE: f64 = 20.; // GIZMOS pub const POINT_RADIUS_HANDLE_SNAP_THRESHOLD: f64 = 8.; pub const POINT_RADIUS_HANDLE_SEGMENT_THRESHOLD: f64 = 7.9; -pub const NUMBER_OF_POINTS_HANDLE_SPOKE_EXTENSION: f64 = 1.2; -pub const NUMBER_OF_POINTS_HANDLE_SPOKE_LENGTH: f64 = 10.; +pub const NUMBER_OF_POINTS_DIAL_SPOKE_EXTENSION: f64 = 1.2; +pub const NUMBER_OF_POINTS_DIAL_SPOKE_LENGTH: f64 = 10.; pub const GIZMO_HIDE_THRESHOLD: f64 = 20.; // SCROLLBARS diff --git a/editor/src/messages/portfolio/document/document_message_handler.rs b/editor/src/messages/portfolio/document/document_message_handler.rs index 0d5bd75972..a4550d4ce8 100644 --- a/editor/src/messages/portfolio/document/document_message_handler.rs +++ b/editor/src/messages/portfolio/document/document_message_handler.rs @@ -1624,7 +1624,7 @@ impl DocumentMessageHandler { subpath.is_inside_subpath(&viewport_polygon, None, None) } ClickTargetType::FreePoint(point) => { - let mut point = point.clone(); + let mut point = *point; point.apply_transform(layer_transform); viewport_polygon.contains_point(point.position) } @@ -3346,9 +3346,9 @@ mod document_message_handler_tests { let rect_bbox_after = document.metadata().bounding_box_viewport(rect_layer).unwrap(); // Verifing the rectangle maintains approximately the same position in viewport space - let before_center = (rect_bbox_before[0] + rect_bbox_before[1]) / 2.; // TODO: Should be: DVec2(0.0, -25.0), regression (#2688) causes it to be: DVec2(100.0, 25.0) - let after_center = (rect_bbox_after[0] + rect_bbox_after[1]) / 2.; // TODO: Should be: DVec2(0.0, -25.0), regression (#2688) causes it to be: DVec2(200.0, 75.0) - let distance = before_center.distance(after_center); // TODO: Should be: 0.0, regression (#2688) causes it to be: 111.80339887498948 + let before_center = (rect_bbox_before[0] + rect_bbox_before[1]) / 2.; // TODO: Should be: DVec2(0., -25.), regression (#2688) causes it to be: DVec2(100., 25.) + let after_center = (rect_bbox_after[0] + rect_bbox_after[1]) / 2.; // TODO: Should be: DVec2(0., -25.), regression (#2688) causes it to be: DVec2(200., 75.) + let distance = before_center.distance(after_center); // TODO: Should be: 0., regression (#2688) causes it to be: 111.80339887498948 assert!( distance < 1., diff --git a/editor/src/messages/tool/common_functionality/gizmos/gizmo_manager.rs b/editor/src/messages/tool/common_functionality/gizmos/gizmo_manager.rs new file mode 100644 index 0000000000..703c85e14d --- /dev/null +++ b/editor/src/messages/tool/common_functionality/gizmos/gizmo_manager.rs @@ -0,0 +1,246 @@ +use crate::messages::message::Message; +use crate::messages::portfolio::document::overlays::utility_types::OverlayContext; +use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier; +use crate::messages::prelude::{DocumentMessageHandler, InputPreprocessorMessageHandler}; +use crate::messages::tool::common_functionality::graph_modification_utils; +use crate::messages::tool::common_functionality::shape_editor::ShapeState; +use crate::messages::tool::common_functionality::shapes::polygon_shape::PolygonGizmoHandler; +use crate::messages::tool::common_functionality::shapes::shape_utility::ShapeGizmoHandler; +use crate::messages::tool::common_functionality::shapes::star_shape::StarGizmoHandler; +use glam::DVec2; +use std::collections::VecDeque; + +/// A unified enum wrapper around all available shape-specific gizmo handlers. +/// +/// This abstraction allows `GizmoManager` to interact with different shape gizmos (like Star or Polygon) +/// using a common interface without needing to know the specific shape type at compile time. +/// +/// Each variant stores a concrete handler (e.g., `StarGizmoHandler`, `PolygonGizmoHandler`) that implements +/// the shape-specific logic for rendering overlays, responding to input, and modifying shape parameters. +#[derive(Clone, Debug, Default)] +pub enum ShapeGizmoHandlers { + #[default] + None, + Star(StarGizmoHandler), + Polygon(PolygonGizmoHandler), +} + +impl ShapeGizmoHandlers { + /// Returns the kind of shape the handler is managing, such as `"star"` or `"polygon"`. + /// Used for grouping logic and distinguishing between handler types at runtime. + pub fn kind(&self) -> &'static str { + match self { + Self::Star(_) => "star", + Self::Polygon(_) => "polygon", + Self::None => "none", + } + } + + /// Dispatches interaction state updates to the corresponding shape-specific handler. + pub fn handle_state(&mut self, layer: LayerNodeIdentifier, mouse_position: DVec2, document: &DocumentMessageHandler, responses: &mut VecDeque) { + match self { + Self::Star(h) => h.handle_state(layer, mouse_position, document, responses), + Self::Polygon(h) => h.handle_state(layer, mouse_position, document, responses), + Self::None => {} + } + } + + /// Checks if any interactive part of the gizmo is currently hovered. + pub fn is_any_gizmo_hovered(&self) -> bool { + match self { + Self::Star(h) => h.is_any_gizmo_hovered(), + Self::Polygon(h) => h.is_any_gizmo_hovered(), + Self::None => false, + } + } + + /// Passes the click interaction to the appropriate gizmo handler if one is hovered. + pub fn handle_click(&mut self) { + match self { + Self::Star(h) => h.handle_click(), + Self::Polygon(h) => h.handle_click(), + Self::None => {} + } + } + + /// Updates the gizmo state while the user is dragging a handle (e.g., adjusting radius). + pub fn handle_update(&mut self, drag_start: DVec2, document: &DocumentMessageHandler, input: &InputPreprocessorMessageHandler, responses: &mut VecDeque) { + match self { + Self::Star(h) => h.handle_update(drag_start, document, input, responses), + Self::Polygon(h) => h.handle_update(drag_start, document, input, responses), + Self::None => {} + } + } + + /// Cleans up any state used by the gizmo handler. + pub fn cleanup(&mut self) { + match self { + Self::Star(h) => h.cleanup(), + Self::Polygon(h) => h.cleanup(), + Self::None => {} + } + } + + /// Draws overlays like control points or outlines for the shape handled by this gizmo. + pub fn overlays( + &self, + document: &DocumentMessageHandler, + layer: Option, + input: &InputPreprocessorMessageHandler, + shape_editor: &mut &mut ShapeState, + mouse_position: DVec2, + overlay_context: &mut OverlayContext, + ) { + match self { + Self::Star(h) => h.overlays(document, layer, input, shape_editor, mouse_position, overlay_context), + Self::Polygon(h) => h.overlays(document, layer, input, shape_editor, mouse_position, overlay_context), + Self::None => {} + } + } + + /// Draws live-updating overlays during drag interactions for the shape handled by this gizmo. + pub fn dragging_overlays( + &self, + document: &DocumentMessageHandler, + input: &InputPreprocessorMessageHandler, + shape_editor: &mut &mut ShapeState, + mouse_position: DVec2, + overlay_context: &mut OverlayContext, + ) { + match self { + Self::Star(h) => h.dragging_overlays(document, input, shape_editor, mouse_position, overlay_context), + Self::Polygon(h) => h.dragging_overlays(document, input, shape_editor, mouse_position, overlay_context), + Self::None => {} + } + } +} + +/// Central manager that coordinates shape gizmo handlers for interactive editing on the canvas. +/// +/// The `GizmoManager` is responsible for detecting which shapes are selected, activating the appropriate +/// shape-specific gizmo, and routing user interactions (hover, click, drag) to the correct handler. +/// It allows editing multiple shapes of the same type or focusing on a single active shape when a gizmo is hovered. +/// +/// ## Responsibilities: +/// - Detect which selected layers support shape gizmos (e.g., stars, polygons) +/// - Activate the correct handler and manage state between frames +/// - Route click, hover, and drag events to the proper shape gizmo +/// - Render overlays and dragging visuals +#[derive(Clone, Debug, Default)] +pub struct GizmoManager { + active_shape_handler: Option, + layers_handlers: Vec<(ShapeGizmoHandlers, Vec)>, +} + +impl GizmoManager { + /// Detects and returns a shape gizmo handler based on the layer type (e.g., star, polygon). + /// + /// Returns `None` if the given layer does not represent a shape with a registered gizmo. + pub fn detect_shape_handler(layer: LayerNodeIdentifier, document: &DocumentMessageHandler) -> Option { + // Star + if graph_modification_utils::get_star_id(layer, &document.network_interface).is_some() { + return Some(ShapeGizmoHandlers::Star(StarGizmoHandler::default())); + } + + // Polygon + if graph_modification_utils::get_polygon_id(layer, &document.network_interface).is_some() { + return Some(ShapeGizmoHandlers::Polygon(PolygonGizmoHandler::default())); + } + + None + } + + /// Returns `true` if a gizmo is currently active (hovered or being interacted with). + pub fn hovering_over_gizmo(&self) -> bool { + self.active_shape_handler.is_some() + } + + /// Called every frame to check selected layers and update the active shape gizmo, if hovered. + /// + /// Also groups all shape layers with the same kind of gizmo to support overlays for multi-shape editing. + pub fn handle_actions(&mut self, mouse_position: DVec2, document: &DocumentMessageHandler, responses: &mut VecDeque) { + let mut handlers_layer: Vec<(ShapeGizmoHandlers, Vec)> = Vec::new(); + + for layer in document.network_interface.selected_nodes().selected_visible_and_unlocked_layers(&document.network_interface) { + if let Some(mut handler) = Self::detect_shape_handler(layer, document) { + handler.handle_state(layer, mouse_position, document, responses); + let is_hovered = handler.is_any_gizmo_hovered(); + + if is_hovered { + self.layers_handlers.clear(); + self.active_shape_handler = Some(handler); + return; + } + + // Try to group this handler with others of the same type + if let Some((_, layers)) = handlers_layer.iter_mut().find(|(existing_handler, _)| existing_handler.kind() == handler.kind()) { + layers.push(layer); + } else { + handlers_layer.push((handler, vec![layer])); + } + } + } + + self.layers_handlers = handlers_layer; + self.active_shape_handler = None; + } + + /// Handles click interactions if a gizmo is active. Returns `true` if a gizmo handled the click. + pub fn handle_click(&mut self) -> bool { + if let Some(handle) = &mut self.active_shape_handler { + handle.handle_click(); + return true; + } + false + } + + pub fn handle_cleanup(&mut self) { + if let Some(handle) = &mut self.active_shape_handler { + handle.cleanup(); + } + } + + /// Passes drag update data to the active gizmo to update shape parameters live. + pub fn handle_update(&mut self, drag_start: DVec2, document: &DocumentMessageHandler, input: &InputPreprocessorMessageHandler, responses: &mut VecDeque) { + if let Some(handle) = &mut self.active_shape_handler { + handle.handle_update(drag_start, document, input, responses); + } + } + + /// Draws overlays for the currently active shape gizmo during a drag interaction. + pub fn dragging_overlays( + &self, + document: &DocumentMessageHandler, + input: &InputPreprocessorMessageHandler, + shape_editor: &mut &mut ShapeState, + mouse_position: DVec2, + overlay_context: &mut OverlayContext, + ) { + if let Some(handle) = &self.active_shape_handler { + handle.dragging_overlays(document, input, shape_editor, mouse_position, overlay_context); + } + } + + /// Draws overlays for either the active gizmo (if hovered) or all grouped selected gizmos. + /// + /// If no single gizmo is active, it renders overlays for all grouped layers with associated handlers. + pub fn overlays( + &self, + document: &DocumentMessageHandler, + input: &InputPreprocessorMessageHandler, + shape_editor: &mut &mut ShapeState, + mouse_position: DVec2, + overlay_context: &mut OverlayContext, + ) { + if let Some(handler) = &self.active_shape_handler { + handler.overlays(document, None, input, shape_editor, mouse_position, overlay_context); + return; + } + + for (handler, selected_layers) in &self.layers_handlers { + for layer in selected_layers { + handler.overlays(document, Some(*layer), input, shape_editor, mouse_position, overlay_context); + } + } + } +} diff --git a/editor/src/messages/tool/common_functionality/gizmos/mod.rs b/editor/src/messages/tool/common_functionality/gizmos/mod.rs new file mode 100644 index 0000000000..108c45d6a3 --- /dev/null +++ b/editor/src/messages/tool/common_functionality/gizmos/mod.rs @@ -0,0 +1,2 @@ +pub mod gizmo_manager; +pub mod shape_gizmos; diff --git a/editor/src/messages/tool/common_functionality/gizmos/shape_gizmos/mod.rs b/editor/src/messages/tool/common_functionality/gizmos/shape_gizmos/mod.rs new file mode 100644 index 0000000000..2b88dddd5e --- /dev/null +++ b/editor/src/messages/tool/common_functionality/gizmos/shape_gizmos/mod.rs @@ -0,0 +1,2 @@ +pub mod number_of_points_dial; +pub mod point_radius_handle; diff --git a/editor/src/messages/tool/common_functionality/gizmos/shape_gizmos/number_of_points_dial.rs b/editor/src/messages/tool/common_functionality/gizmos/shape_gizmos/number_of_points_dial.rs new file mode 100644 index 0000000000..3995a1f401 --- /dev/null +++ b/editor/src/messages/tool/common_functionality/gizmos/shape_gizmos/number_of_points_dial.rs @@ -0,0 +1,209 @@ +use crate::consts::{GIZMO_HIDE_THRESHOLD, NUMBER_OF_POINTS_DIAL_SPOKE_EXTENSION, NUMBER_OF_POINTS_DIAL_SPOKE_LENGTH, POINT_RADIUS_HANDLE_SEGMENT_THRESHOLD}; +use crate::messages::frontend::utility_types::MouseCursorIcon; +use crate::messages::message::Message; +use crate::messages::portfolio::document::overlays::utility_types::OverlayContext; +use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier; +use crate::messages::portfolio::document::utility_types::network_interface::InputConnector; +use crate::messages::prelude::Responses; +use crate::messages::prelude::{DocumentMessageHandler, FrontendMessage, InputPreprocessorMessageHandler, NodeGraphMessage}; +use crate::messages::tool::common_functionality::graph_modification_utils; +use crate::messages::tool::common_functionality::shape_editor::ShapeState; +use crate::messages::tool::common_functionality::shapes::shape_utility::{extract_polygon_parameters, inside_polygon, inside_star, polygon_outline, polygon_vertex_position, star_outline}; +use crate::messages::tool::common_functionality::shapes::shape_utility::{extract_star_parameters, star_vertex_position}; +use glam::{DAffine2, DVec2}; +use graph_craft::document::NodeInput; +use graph_craft::document::value::TaggedValue; +use std::collections::VecDeque; +use std::f64::consts::TAU; + +#[derive(Clone, Debug, Default, PartialEq)] +pub enum NumberOfPointsDialState { + #[default] + Inactive, + Hover, + Dragging, +} + +#[derive(Clone, Debug, Default)] +pub struct NumberOfPointsDial { + pub layer: Option, + pub initial_points: u32, + pub handle_state: NumberOfPointsDialState, +} + +impl NumberOfPointsDial { + pub fn cleanup(&mut self) { + self.handle_state = NumberOfPointsDialState::Inactive; + self.layer = None; + } + + pub fn update_state(&mut self, state: NumberOfPointsDialState) { + self.handle_state = state; + } + + pub fn is_hovering(&self) -> bool { + self.handle_state == NumberOfPointsDialState::Hover + } + + pub fn is_dragging(&self) -> bool { + self.handle_state == NumberOfPointsDialState::Dragging + } + + pub fn handle_actions(&mut self, layer: LayerNodeIdentifier, mouse_position: DVec2, document: &DocumentMessageHandler, responses: &mut VecDeque) { + match &self.handle_state { + NumberOfPointsDialState::Inactive => { + // Star + if let Some((sides, radius1, radius2)) = extract_star_parameters(Some(layer), document) { + let viewport = document.metadata().transform_to_viewport(layer); + let center = viewport.transform_point2(DVec2::ZERO); + + let point_on_max_radius = star_vertex_position(viewport, 0, sides, radius1, radius2); + + if mouse_position.distance(center) < NUMBER_OF_POINTS_DIAL_SPOKE_LENGTH && point_on_max_radius.distance(center) > GIZMO_HIDE_THRESHOLD { + self.layer = Some(layer); + self.initial_points = sides; + self.update_state(NumberOfPointsDialState::Hover); + responses.add(FrontendMessage::UpdateMouseCursor { cursor: MouseCursorIcon::EWResize }); + } + } + + // Polygon + if let Some((sides, radius)) = extract_polygon_parameters(Some(layer), document) { + let viewport = document.metadata().transform_to_viewport(layer); + let center = viewport.transform_point2(DVec2::ZERO); + + let point_on_max_radius = polygon_vertex_position(viewport, 0, sides, radius); + + if mouse_position.distance(center) < NUMBER_OF_POINTS_DIAL_SPOKE_LENGTH && point_on_max_radius.distance(center) > GIZMO_HIDE_THRESHOLD { + self.layer = Some(layer); + self.initial_points = sides; + self.update_state(NumberOfPointsDialState::Hover); + responses.add(FrontendMessage::UpdateMouseCursor { cursor: MouseCursorIcon::EWResize }); + } + } + } + NumberOfPointsDialState::Hover | NumberOfPointsDialState::Dragging => { + let Some(layer) = self.layer else { return }; + + let viewport = document.metadata().transform_to_viewport(layer); + let center = viewport.transform_point2(DVec2::ZERO); + + if mouse_position.distance(center) > NUMBER_OF_POINTS_DIAL_SPOKE_LENGTH && matches!(&self.handle_state, NumberOfPointsDialState::Hover) { + self.update_state(NumberOfPointsDialState::Inactive); + self.layer = None; + responses.add(FrontendMessage::UpdateMouseCursor { cursor: MouseCursorIcon::Default }); + } + } + } + } + + pub fn overlays(&self, document: &DocumentMessageHandler, layer: Option, shape_editor: &mut &mut ShapeState, mouse_position: DVec2, overlay_context: &mut OverlayContext) { + match &self.handle_state { + NumberOfPointsDialState::Inactive => { + let Some(layer) = layer else { return }; + + // Star + if let Some((sides, radius1, radius2)) = extract_star_parameters(Some(layer), document) { + let radius = radius1.max(radius2); + let viewport = document.metadata().transform_to_viewport(layer); + let center = viewport.transform_point2(DVec2::ZERO); + + if let Some(closest_segment) = shape_editor.upper_closest_segment(&document.network_interface, mouse_position, POINT_RADIUS_HANDLE_SEGMENT_THRESHOLD) { + if closest_segment.layer() == layer { + return; + } + } + let point_on_max_radius = star_vertex_position(viewport, 0, sides, radius1, radius2); + + if inside_star(viewport, sides, radius1, radius2, mouse_position) && point_on_max_radius.distance(center) > GIZMO_HIDE_THRESHOLD { + self.draw_spokes(center, viewport, sides, radius, overlay_context); + return; + } + } + + // Polygon + if let Some((sides, radius)) = extract_polygon_parameters(Some(layer), document) { + let viewport = document.metadata().transform_to_viewport(layer); + let center = viewport.transform_point2(DVec2::ZERO); + + if let Some(closest_segment) = shape_editor.upper_closest_segment(&document.network_interface, mouse_position, POINT_RADIUS_HANDLE_SEGMENT_THRESHOLD) { + if closest_segment.layer() == layer { + return; + } + } + let point_on_max_radius = polygon_vertex_position(viewport, 0, sides, radius); + + if inside_polygon(viewport, sides, radius, mouse_position) && point_on_max_radius.distance(center) > GIZMO_HIDE_THRESHOLD { + self.draw_spokes(center, viewport, sides, radius, overlay_context); + } + } + } + NumberOfPointsDialState::Hover | NumberOfPointsDialState::Dragging => { + let Some(layer) = self.layer else { + return; + }; + + // Get the star's greater radius or polygon's radius, as well as the number of sides + let Some((sides, radius)) = extract_star_parameters(Some(layer), document) + .map(|(sides, r1, r2)| (sides, r1.max(r2))) + .or_else(|| extract_polygon_parameters(Some(layer), document)) + else { + return; + }; + + let viewport = document.metadata().transform_to_viewport(layer); + let center = viewport.transform_point2(DVec2::ZERO); + + // Draw either the star or polygon outline + star_outline(Some(layer), document, overlay_context); + polygon_outline(Some(layer), document, overlay_context); + + self.draw_spokes(center, viewport, sides, radius, overlay_context); + } + } + } + + fn draw_spokes(&self, center: DVec2, viewport: DAffine2, sides: u32, radius: f64, overlay_context: &mut OverlayContext) { + for i in 0..sides { + let angle = ((i as f64) * TAU) / (sides as f64); + + let point = viewport.transform_point2(DVec2 { + x: radius * angle.sin(), + y: -radius * angle.cos(), + }); + + let Some(direction) = (point - center).try_normalize() else { continue }; + + // If the user zooms out such that shape is very small hide the gizmo + if point.distance(center) < GIZMO_HIDE_THRESHOLD { + return; + } + + let end_point = direction * NUMBER_OF_POINTS_DIAL_SPOKE_LENGTH; + if matches!(self.handle_state, NumberOfPointsDialState::Hover | NumberOfPointsDialState::Dragging) { + overlay_context.line(center, end_point * NUMBER_OF_POINTS_DIAL_SPOKE_EXTENSION + center, None, None); + } else { + overlay_context.line(center, end_point + center, None, None); + } + } + } + + pub fn update_number_of_sides(&self, document: &DocumentMessageHandler, input: &InputPreprocessorMessageHandler, responses: &mut VecDeque, drag_start: DVec2) { + let delta = input.mouse.position - document.metadata().document_to_viewport.transform_point2(drag_start); + let sign = (input.mouse.position.x - document.metadata().document_to_viewport.transform_point2(drag_start).x).signum(); + let net_delta = (delta.length() / 25.).round() * sign; + + let Some(layer) = self.layer else { return }; + let Some(node_id) = graph_modification_utils::get_star_id(layer, &document.network_interface).or(graph_modification_utils::get_polygon_id(layer, &document.network_interface)) else { + return; + }; + + let new_point_count = ((self.initial_points as i32) + (net_delta as i32)).max(3); + + responses.add(NodeGraphMessage::SetInput { + input_connector: InputConnector::node(node_id, 1), + input: NodeInput::value(TaggedValue::U32(new_point_count as u32), false), + }); + responses.add(NodeGraphMessage::RunDocumentGraph); + } +} diff --git a/editor/src/messages/tool/common_functionality/shape_gizmos/point_radius_handle.rs b/editor/src/messages/tool/common_functionality/gizmos/shape_gizmos/point_radius_handle.rs similarity index 54% rename from editor/src/messages/tool/common_functionality/shape_gizmos/point_radius_handle.rs rename to editor/src/messages/tool/common_functionality/gizmos/shape_gizmos/point_radius_handle.rs index 4a72de0319..fc00e078cf 100644 --- a/editor/src/messages/tool/common_functionality/shape_gizmos/point_radius_handle.rs +++ b/editor/src/messages/tool/common_functionality/gizmos/shape_gizmos/point_radius_handle.rs @@ -1,12 +1,15 @@ -use crate::consts::{COLOR_OVERLAY_RED, GIZMO_HIDE_THRESHOLD, POINT_RADIUS_HANDLE_SNAP_THRESHOLD}; +use crate::consts::GIZMO_HIDE_THRESHOLD; +use crate::consts::{COLOR_OVERLAY_RED, POINT_RADIUS_HANDLE_SNAP_THRESHOLD}; +use crate::messages::frontend::utility_types::MouseCursorIcon; use crate::messages::message::Message; -use crate::messages::portfolio::document::overlays::utility_types::OverlayContext; use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier; -use crate::messages::portfolio::document::utility_types::network_interface::InputConnector; +use crate::messages::portfolio::document::{overlays::utility_types::OverlayContext, utility_types::network_interface::InputConnector}; +use crate::messages::prelude::FrontendMessage; use crate::messages::prelude::Responses; use crate::messages::prelude::{DocumentMessageHandler, InputPreprocessorMessageHandler, NodeGraphMessage}; use crate::messages::tool::common_functionality::graph_modification_utils::{self, NodeGraphLayer}; -use crate::messages::tool::common_functionality::shapes::shape_utility::{draw_snapping_ticks, extract_polygon_parameters, extract_star_parameters, polygon_vertex_position, star_vertex_position}; +use crate::messages::tool::common_functionality::shapes::shape_utility::{draw_snapping_ticks, extract_polygon_parameters, polygon_outline, polygon_vertex_position, star_outline}; +use crate::messages::tool::common_functionality::shapes::shape_utility::{extract_star_parameters, star_vertex_position}; use glam::DVec2; use graph_craft::document::NodeInput; use graph_craft::document::value::TaggedValue; @@ -39,78 +42,71 @@ impl PointRadiusHandle { self.layer = None; } - pub fn is_inactive(&self) -> bool { - self.handle_state == PointRadiusHandleState::Inactive - } - pub fn hovered(&self) -> bool { self.handle_state == PointRadiusHandleState::Hover } + pub fn is_dragging_or_snapped(&self) -> bool { + self.handle_state == PointRadiusHandleState::Dragging || matches!(self.handle_state, PointRadiusHandleState::Snapped(_)) + } + pub fn update_state(&mut self, state: PointRadiusHandleState) { self.handle_state = state; } - pub fn handle_actions(&mut self, document: &DocumentMessageHandler, mouse_position: DVec2) { + pub fn handle_actions(&mut self, layer: LayerNodeIdentifier, document: &DocumentMessageHandler, mouse_position: DVec2, responses: &mut VecDeque) { match &self.handle_state { PointRadiusHandleState::Inactive => { - for layer in document - .network_interface - .selected_nodes() - .selected_visible_and_unlocked_layers(&document.network_interface) - .filter(|layer| { - graph_modification_utils::get_star_id(*layer, &document.network_interface).is_some() || graph_modification_utils::get_polygon_id(*layer, &document.network_interface).is_some() - }) { - // Draw the point handle gizmo for the star shape - if let Some((n, radius1, radius2)) = extract_star_parameters(Some(layer), document) { - let viewport = document.metadata().transform_to_viewport(layer); + // Draw the point handle gizmo for the star shape + if let Some((sides, radius1, radius2)) = extract_star_parameters(Some(layer), document) { + let viewport = document.metadata().transform_to_viewport(layer); - for i in 0..2 * n { - let (radius, radius_index) = if i % 2 == 0 { (radius1, 2) } else { (radius2, 3) }; - let point = star_vertex_position(viewport, i as i32, n, radius1, radius2); - let center = viewport.transform_point2(DVec2::ZERO); + for i in 0..2 * sides { + let (radius, radius_index) = if i % 2 == 0 { (radius1, 2) } else { (radius2, 3) }; + let point = star_vertex_position(viewport, i as i32, sides, radius1, radius2); + let center = viewport.transform_point2(DVec2::ZERO); - // If the user zooms out such that shape is very small hide the gizmo - if point.distance(center) < GIZMO_HIDE_THRESHOLD { - return; - } + // If the user zooms out such that shape is very small hide the gizmo + if point.distance(center) < GIZMO_HIDE_THRESHOLD { + return; + } - if point.distance(mouse_position) < 5. { - self.radius_index = radius_index; - self.layer = Some(layer); - self.point = i; - self.snap_radii = Self::calculate_snap_radii(document, layer, radius_index); - self.initial_radius = radius; - self.update_state(PointRadiusHandleState::Hover); + if point.distance(mouse_position) < 5. { + self.radius_index = radius_index; + self.layer = Some(layer); + self.point = i; + self.snap_radii = Self::calculate_snap_radii(document, layer, radius_index); + self.initial_radius = radius; + responses.add(FrontendMessage::UpdateMouseCursor { cursor: MouseCursorIcon::Default }); + self.update_state(PointRadiusHandleState::Hover); - return; - } + return; } } + } - // Draw the point handle gizmo for the polygon shape - if let Some((n, radius)) = extract_polygon_parameters(Some(layer), document) { - let viewport = document.metadata().transform_to_viewport(layer); + // Draw the point handle gizmo for the polygon shape + if let Some((sides, radius)) = extract_polygon_parameters(Some(layer), document) { + let viewport = document.metadata().transform_to_viewport(layer); - for i in 0..n { - let point = polygon_vertex_position(viewport, i as i32, n, radius); - let center = viewport.transform_point2(DVec2::ZERO); + for i in 0..sides { + let point = polygon_vertex_position(viewport, i as i32, sides, radius); + let center = viewport.transform_point2(DVec2::ZERO); - // If the user zooms out so the shape is very small, hide the gizmo - if point.distance(center) < GIZMO_HIDE_THRESHOLD { - return; - } + // If the user zooms out such that shape is very small hide the gizmo + if point.distance(center) < GIZMO_HIDE_THRESHOLD { + return; + } - if point.distance(mouse_position) < 5. { - self.radius_index = 2; - self.layer = Some(layer); - self.point = i; - self.snap_radii.clear(); - self.initial_radius = radius; - self.update_state(PointRadiusHandleState::Hover); - - return; - } + if point.distance(mouse_position) < 5. { + self.radius_index = 2; + self.layer = Some(layer); + self.point = i; + self.snap_radii.clear(); + self.initial_radius = radius; + self.update_state(PointRadiusHandleState::Hover); + responses.add(FrontendMessage::UpdateMouseCursor { cursor: MouseCursorIcon::Default }); + return; } } } @@ -121,8 +117,9 @@ impl PointRadiusHandle { let viewport = document.metadata().transform_to_viewport(layer); - if let Some((n, radius1, radius2)) = extract_star_parameters(Some(layer), document) { - let point = star_vertex_position(viewport, self.point as i32, n, radius1, radius2); + // Star + if let Some((sides, radius1, radius2)) = extract_star_parameters(Some(layer), document) { + let point = star_vertex_position(viewport, self.point as i32, sides, radius1, radius2); if matches!(&self.handle_state, PointRadiusHandleState::Hover) && (mouse_position - point).length() > 5. { self.update_state(PointRadiusHandleState::Inactive); @@ -131,8 +128,9 @@ impl PointRadiusHandle { } } - if let Some((n, radius)) = extract_polygon_parameters(Some(layer), document) { - let point = polygon_vertex_position(viewport, self.point as i32, n, radius); + // Polygon + if let Some((sides, radius)) = extract_polygon_parameters(Some(layer), document) { + let point = polygon_vertex_position(viewport, self.point as i32, sides, radius); if matches!(&self.handle_state, PointRadiusHandleState::Hover) && (mouse_position - point).length() > 5. { self.update_state(PointRadiusHandleState::Inactive); @@ -144,85 +142,109 @@ impl PointRadiusHandle { } } - pub fn overlays(&mut self, other_gizmo_active: bool, document: &DocumentMessageHandler, input: &InputPreprocessorMessageHandler, mouse_position: DVec2, overlay_context: &mut OverlayContext) { + pub fn overlays( + &self, + selected_star_layer: Option, + document: &DocumentMessageHandler, + input: &InputPreprocessorMessageHandler, + mouse_position: DVec2, + overlay_context: &mut OverlayContext, + ) { match &self.handle_state { PointRadiusHandleState::Inactive => { - let selected_nodes = document.network_interface.selected_nodes(); - let layers = selected_nodes.selected_visible_and_unlocked_layers(&document.network_interface).filter(|layer| { - graph_modification_utils::get_star_id(*layer, &document.network_interface).is_some() || graph_modification_utils::get_polygon_id(*layer, &document.network_interface).is_some() - }); - for layer in layers { - if other_gizmo_active { - return; - } - // Draw the point handle gizmo for the star shape - if let Some((n, radius1, radius2)) = extract_star_parameters(Some(layer), document) { - let viewport = document.metadata().transform_to_viewport(layer); + let Some(layer) = selected_star_layer else { return }; - for i in 0..(2 * n) { - let point = star_vertex_position(viewport, i as i32, n, radius1, radius2); - let center = viewport.transform_point2(DVec2::ZERO); - let viewport_diagonal = input.viewport_bounds.size().length(); + // Draw the point handle gizmo for the star shape + if let Some((sides, radius1, radius2)) = extract_star_parameters(Some(layer), document) { + let viewport = document.metadata().transform_to_viewport(layer); - // If the user zooms out such that shape is very small hide the gizmo - if point.distance(center) < GIZMO_HIDE_THRESHOLD { - return; - } + for i in 0..(2 * sides) { + let point = star_vertex_position(viewport, i as i32, sides, radius1, radius2); + let center = viewport.transform_point2(DVec2::ZERO); + let viewport_diagonal = input.viewport_bounds.size().length(); - if point.distance(mouse_position) < 5. { - let Some(direction) = (point - center).try_normalize() else { continue }; - - overlay_context.manipulator_handle(point, true, None); - let angle = ((i as f64) * PI) / (n as f64); - overlay_context.line(center, center + direction * viewport_diagonal, None, None); - - draw_snapping_ticks(&self.snap_radii, direction, viewport, angle, overlay_context); - - return; - } - - overlay_context.manipulator_handle(point, false, None); + // If the user zooms out such that shape is very small hide the gizmo + if point.distance(center) < GIZMO_HIDE_THRESHOLD { + return; } - } - // Draw the point handle gizmo for the Polygon shape - if let Some((n, radius)) = extract_polygon_parameters(Some(layer), document) { - let viewport = document.metadata().transform_to_viewport(layer); + if point.distance(mouse_position) < 5. { + let Some(direction) = (point - center).try_normalize() else { continue }; - for i in 0..n { - let point = polygon_vertex_position(viewport, i as i32, n, radius); - let center = viewport.transform_point2(DVec2::ZERO); - let viewport_diagonal = input.viewport_bounds.size().length(); + overlay_context.manipulator_handle(point, true, None); + let angle = ((i as f64) * PI) / (sides as f64); + overlay_context.line(center, center + direction * viewport_diagonal, None, None); - // If the user zooms out such that shape is very small hide the gizmo - if point.distance(center) < GIZMO_HIDE_THRESHOLD { - return; - } + draw_snapping_ticks(&self.snap_radii, direction, viewport, angle, overlay_context); - if point.distance(mouse_position) < 5. { - let Some(direction) = (point - center).try_normalize() else { continue }; - - overlay_context.manipulator_handle(point, true, None); - overlay_context.line(center, center + direction * viewport_diagonal, None, None); - - return; - } - - overlay_context.manipulator_handle(point, false, None); + return; } + + overlay_context.manipulator_handle(point, false, None); + } + } + + // Draw the point handle gizmo for the Polygon shape + if let Some((sides, radius)) = extract_polygon_parameters(Some(layer), document) { + let viewport = document.metadata().transform_to_viewport(layer); + + for i in 0..sides { + let point = polygon_vertex_position(viewport, i as i32, sides, radius); + let center = viewport.transform_point2(DVec2::ZERO); + let viewport_diagonal = input.viewport_bounds.size().length(); + + // If the user zooms out such that shape is very small hide the gizmo + if point.distance(center) < GIZMO_HIDE_THRESHOLD { + return; + } + + if point.distance(mouse_position) < 5. { + let Some(direction) = (point - center).try_normalize() else { continue }; + + overlay_context.manipulator_handle(point, true, None); + overlay_context.line(center, center + direction * viewport_diagonal, None, None); + + return; + } + + overlay_context.manipulator_handle(point, false, None); } } } PointRadiusHandleState::Dragging | PointRadiusHandleState::Hover => { let Some(layer) = self.layer else { return }; + let viewport = document.metadata().transform_to_viewport(layer); let center = viewport.transform_point2(DVec2::ZERO); let viewport_diagonal = input.viewport_bounds.size().length(); - if let Some((n, radius1, radius2)) = extract_star_parameters(Some(layer), document) { - let angle = ((self.point as f64) * PI) / (n as f64); - let point = star_vertex_position(viewport, self.point as i32, n, radius1, radius2); + // Star + if let Some((sides, radius1, radius2)) = extract_star_parameters(Some(layer), document) { + let angle = ((self.point as f64) * PI) / (sides as f64); + let point = star_vertex_position(viewport, self.point as i32, sides, radius1, radius2); + + let Some(direction) = (point - center).try_normalize() else { return }; + + // Draws the ray from the center to the dragging point extending till the viewport + overlay_context.manipulator_handle(point, true, None); + overlay_context.line(center, center + direction * viewport_diagonal, None, None); + star_outline(Some(layer), document, overlay_context); + + // Make the ticks for snapping + + // If dragging to make radius negative don't show the + if (mouse_position - center).dot(direction) < 0. { + return; + } + draw_snapping_ticks(&self.snap_radii, direction, viewport, angle, overlay_context); + + return; + } + + // Polygon + if let Some((sides, radius)) = extract_polygon_parameters(Some(layer), document) { + let point = polygon_vertex_position(viewport, self.point as i32, sides, radius); let Some(direction) = (point - center).try_normalize() else { return }; @@ -230,47 +252,33 @@ impl PointRadiusHandle { overlay_context.manipulator_handle(point, true, None); overlay_context.line(center, center + direction * viewport_diagonal, None, None); - // Makes the tick marks for snapping - - // Only show the snapping ticks if the radius is positive - if (mouse_position - center).dot(direction) >= 0. { - draw_snapping_ticks(&self.snap_radii, direction, viewport, angle, overlay_context); - } - - return; - } - - if let Some((n, radius)) = extract_polygon_parameters(Some(layer), document) { - let point = polygon_vertex_position(viewport, self.point as i32, n, radius); - - let Some(direction) = (point - center).try_normalize() else { return }; - - // Draws the ray from the center to the dragging point and extending until the viewport edge is reached - overlay_context.manipulator_handle(point, true, None); - overlay_context.line(center, center + direction * viewport_diagonal, None, None); + polygon_outline(Some(layer), document, overlay_context); } } PointRadiusHandleState::Snapped(snapping_index) => { let Some(layer) = self.layer else { return }; - let Some((n, radius1, radius2)) = extract_star_parameters(Some(layer), document) else { return }; + let Some((sides, radius1, radius2)) = extract_star_parameters(Some(layer), document) else { + return; + }; + let viewport = document.metadata().transform_to_viewport(layer); let center = viewport.transform_point2(DVec2::ZERO); match snapping_index { - // Make a triangle with the previous two points + // Make a triangle with previous two points 0 => { - let before_outer_position = star_vertex_position(viewport, (self.point as i32) - 2, n, radius1, radius2); - let outer_position = star_vertex_position(viewport, (self.point as i32) - 1, n, radius1, radius2); - let point_position = star_vertex_position(viewport, self.point as i32, n, radius1, radius2); + let before_outer_position = star_vertex_position(viewport, (self.point as i32) - 2, sides, radius1, radius2); + let outer_position = star_vertex_position(viewport, (self.point as i32) - 1, sides, radius1, radius2); + let point_position = star_vertex_position(viewport, self.point as i32, sides, radius1, radius2); overlay_context.line(before_outer_position, outer_position, Some(COLOR_OVERLAY_RED), Some(3.)); overlay_context.line(outer_position, point_position, Some(COLOR_OVERLAY_RED), Some(3.)); + let l1 = (before_outer_position - outer_position).length() * 0.2; let Some(l1_direction) = (before_outer_position - outer_position).try_normalize() else { return }; let Some(l2_direction) = (point_position - outer_position).try_normalize() else { return }; let Some(direction) = (center - outer_position).try_normalize() else { return }; - let l1 = 0.2 * (before_outer_position - outer_position).length(); let new_point = SQRT_2 * l1 * direction + outer_position; let before_outer_position = l1 * l1_direction + outer_position; @@ -280,18 +288,20 @@ impl PointRadiusHandle { overlay_context.line(new_point, point_position, Some(COLOR_OVERLAY_RED), Some(3.)); } 1 => { - let before_outer_position = star_vertex_position(viewport, (self.point as i32) - 1, n, radius1, radius2); - let after_point_position = star_vertex_position(viewport, (self.point as i32) + 1, n, radius1, radius2); - let point_position = star_vertex_position(viewport, self.point as i32, n, radius1, radius2); + let before_outer_position = star_vertex_position(viewport, (self.point as i32) - 1, sides, radius1, radius2); + + let after_point_position = star_vertex_position(viewport, (self.point as i32) + 1, sides, radius1, radius2); + + let point_position = star_vertex_position(viewport, self.point as i32, sides, radius1, radius2); overlay_context.line(before_outer_position, point_position, Some(COLOR_OVERLAY_RED), Some(3.)); overlay_context.line(point_position, after_point_position, Some(COLOR_OVERLAY_RED), Some(3.)); + let l1 = (before_outer_position - point_position).length() * 0.2; let Some(l1_direction) = (before_outer_position - point_position).try_normalize() else { return }; let Some(l2_direction) = (after_point_position - point_position).try_normalize() else { return }; let Some(direction) = (center - point_position).try_normalize() else { return }; - let l1 = 0.2 * (before_outer_position - point_position).length(); let new_point = SQRT_2 * l1 * direction + point_position; let before_outer_position = l1 * l1_direction + point_position; @@ -301,35 +311,37 @@ impl PointRadiusHandle { overlay_context.line(new_point, after_point_position, Some(COLOR_OVERLAY_RED), Some(3.)); } i => { - // Use `self.point` as an absolute reference, as it matches the index of the star's vertices starting from 0 + // Use `self.point` as absolute reference as it matches the index of vertices of the star starting from 0 if i % 2 != 0 { // Flipped case - let point_position = star_vertex_position(viewport, self.point as i32, n, radius1, radius2); + let point_position = star_vertex_position(viewport, self.point as i32, sides, radius1, radius2); let target_index = (1 - (*i as i32)).abs() + (self.point as i32); - let target_point_position = star_vertex_position(viewport, target_index, n, radius1, radius2); + let target_point_position = star_vertex_position(viewport, target_index, sides, radius1, radius2); let mirrored_index = 2 * (self.point as i32) - target_index; - let mirrored = star_vertex_position(viewport, mirrored_index, n, radius1, radius2); + let mirrored = star_vertex_position(viewport, mirrored_index, sides, radius1, radius2); overlay_context.line(point_position, target_point_position, Some(COLOR_OVERLAY_RED), Some(3.)); overlay_context.line(point_position, mirrored, Some(COLOR_OVERLAY_RED), Some(3.)); } else { let outer_index = (self.point as i32) - 1; - let outer_position = star_vertex_position(viewport, outer_index, n, radius1, radius2); + let outer_position = star_vertex_position(viewport, outer_index, sides, radius1, radius2); // The vertex which is colinear with the point we are dragging and its previous outer vertex let target_index = (self.point as i32) + (*i as i32) - 1; - let target_point_position = star_vertex_position(viewport, target_index, n, radius1, radius2); + let target_point_position = star_vertex_position(viewport, target_index, sides, radius1, radius2); let mirrored_index = 2 * outer_index - target_index; - let mirrored = star_vertex_position(viewport, mirrored_index, n, radius1, radius2); + let mirrored = star_vertex_position(viewport, mirrored_index, sides, radius1, radius2); overlay_context.line(outer_position, target_point_position, Some(COLOR_OVERLAY_RED), Some(3.)); overlay_context.line(outer_position, mirrored, Some(COLOR_OVERLAY_RED), Some(3.)); } } } + + star_outline(Some(layer), document, overlay_context); } } } @@ -342,29 +354,32 @@ impl PointRadiusHandle { }; let other_index = if radius_index == 3 { 2 } else { 3 }; + let Some(&TaggedValue::F64(other_radius)) = node_inputs[other_index].as_value() else { return snap_radii; }; - let Some(&TaggedValue::U32(n)) = node_inputs[1].as_value() else { + let Some(&TaggedValue::U32(sides)) = node_inputs[1].as_value() else { return snap_radii; }; // Inner radius for 90° - let b = FRAC_PI_4 * 3. - PI / (n as f64); + let b = FRAC_PI_4 * 3. - PI / (sides as f64); let angle = b.sin(); let required_radius = (other_radius / angle) * FRAC_1_SQRT_2; snap_radii.push(required_radius); - // Also add the case where the radius exceeds the other radius (the "flipped" case) + // Also push the case when the when it length increases more than the other + let flipped = other_radius * angle * SQRT_2; + snap_radii.push(flipped); - for i in 1..n { - let n = n as f64; + for i in 1..sides { + let sides = sides as f64; let i = i as f64; - let denominator = 2. * ((PI * (i - 1.)) / n).cos() * ((PI * i) / n).sin(); - let numerator = ((2. * PI * i) / n).sin(); + let denominator = 2. * ((PI * (i - 1.)) / sides).cos() * ((PI * i) / sides).sin(); + let numerator = ((2. * PI * i) / sides).sin(); let factor = numerator / denominator; if factor < 0. { @@ -392,33 +407,32 @@ impl PointRadiusHandle { // Check if either index is 0 or 1 and prioritize them match (*i_a == 0 || *i_a == 1, *i_b == 0 || *i_b == 1) { - (true, false) => std::cmp::Ordering::Less, // a is priority index, b is not - (false, true) => std::cmp::Ordering::Greater, // b is priority index, a is not - _ => dist_a.partial_cmp(&dist_b).unwrap_or(std::cmp::Ordering::Equal), // normal comparison + // `a` is priority index, `b` is not + (true, false) => std::cmp::Ordering::Less, + // `b` is priority index, `a` is not + (false, true) => std::cmp::Ordering::Greater, + // Normal comparison + _ => dist_a.partial_cmp(&dist_b).unwrap_or(std::cmp::Ordering::Equal), } }) .map(|(i, rad)| (i, *rad - original_radius)) } - pub fn update_inner_radius( - &mut self, - document: &DocumentMessageHandler, - input: &InputPreprocessorMessageHandler, - layer: LayerNodeIdentifier, - responses: &mut VecDeque, - drag_start: DVec2, - ) { + pub fn update_inner_radius(&mut self, document: &DocumentMessageHandler, input: &InputPreprocessorMessageHandler, responses: &mut VecDeque, drag_start: DVec2) { + let Some(layer) = self.layer else { return }; + let Some(node_id) = graph_modification_utils::get_star_id(layer, &document.network_interface).or(graph_modification_utils::get_polygon_id(layer, &document.network_interface)) else { return; }; - let transform = document.network_interface.document_metadata().transform_to_viewport(layer); - let center = transform.transform_point2(DVec2::ZERO); + let viewport_transform = document.network_interface.document_metadata().transform_to_viewport(layer); + let document_transform = document.network_interface.document_metadata().transform_to_document(layer); + let center = viewport_transform.transform_point2(DVec2::ZERO); let radius_index = self.radius_index; let original_radius = self.initial_radius; - let delta = input.mouse.position - document.metadata().document_to_viewport.transform_point2(drag_start); + let delta = viewport_transform.inverse().transform_point2(input.mouse.position) - document_transform.inverse().transform_point2(drag_start); let radius = document.metadata().document_to_viewport.transform_point2(drag_start) - center; let projection = delta.project_onto(radius); let sign = radius.dot(delta).signum(); diff --git a/editor/src/messages/tool/common_functionality/mod.rs b/editor/src/messages/tool/common_functionality/mod.rs index 4a003d0254..ca3e629e19 100644 --- a/editor/src/messages/tool/common_functionality/mod.rs +++ b/editor/src/messages/tool/common_functionality/mod.rs @@ -1,12 +1,12 @@ pub mod auto_panning; pub mod color_selector; pub mod compass_rose; +pub mod gizmos; pub mod graph_modification_utils; pub mod measure; pub mod pivot; pub mod resize; pub mod shape_editor; -pub mod shape_gizmos; pub mod shapes; pub mod snapping; pub mod transformation_cage; diff --git a/editor/src/messages/tool/common_functionality/shape_gizmos/mod.rs b/editor/src/messages/tool/common_functionality/shape_gizmos/mod.rs deleted file mode 100644 index 03951cd2d7..0000000000 --- a/editor/src/messages/tool/common_functionality/shape_gizmos/mod.rs +++ /dev/null @@ -1,2 +0,0 @@ -pub mod number_of_points_handle; -pub mod point_radius_handle; diff --git a/editor/src/messages/tool/common_functionality/shape_gizmos/number_of_points_handle.rs b/editor/src/messages/tool/common_functionality/shape_gizmos/number_of_points_handle.rs deleted file mode 100644 index d698292ea4..0000000000 --- a/editor/src/messages/tool/common_functionality/shape_gizmos/number_of_points_handle.rs +++ /dev/null @@ -1,241 +0,0 @@ -use crate::consts::{GIZMO_HIDE_THRESHOLD, NUMBER_OF_POINTS_HANDLE_SPOKE_EXTENSION, NUMBER_OF_POINTS_HANDLE_SPOKE_LENGTH, POINT_RADIUS_HANDLE_SEGMENT_THRESHOLD}; -use crate::messages::frontend::utility_types::MouseCursorIcon; -use crate::messages::message::Message; -use crate::messages::portfolio::document::overlays::utility_types::OverlayContext; -use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier; -use crate::messages::portfolio::document::utility_types::network_interface::InputConnector; -use crate::messages::prelude::Responses; -use crate::messages::prelude::{DocumentMessageHandler, FrontendMessage, InputPreprocessorMessageHandler, NodeGraphMessage}; -use crate::messages::tool::common_functionality::graph_modification_utils; -use crate::messages::tool::common_functionality::shape_editor::ShapeState; -use crate::messages::tool::common_functionality::shapes::shape_utility::{ - extract_polygon_parameters, extract_star_parameters, inside_polygon, inside_star, polygon_vertex_position, star_vertex_position, -}; -use crate::messages::tool::tool_messages::tool_prelude::Key; -use glam::{DAffine2, DVec2}; -use graph_craft::document::NodeInput; -use graph_craft::document::value::TaggedValue; -use std::collections::VecDeque; -use std::f64::consts::TAU; - -#[derive(Clone, Debug, Default, PartialEq)] -pub enum NumberOfPointsHandleState { - #[default] - Inactive, - Hover, - Dragging, -} - -#[derive(Clone, Debug, Default)] -pub struct NumberOfPointsHandle { - pub layer: Option, - pub initial_points: u32, - pub handle_state: NumberOfPointsHandleState, -} - -impl NumberOfPointsHandle { - pub fn cleanup(&mut self) { - self.handle_state = NumberOfPointsHandleState::Inactive; - self.layer = None; - } - - pub fn update_state(&mut self, state: NumberOfPointsHandleState) { - self.handle_state = state; - } - - pub fn is_hovering(&self) -> bool { - self.handle_state == NumberOfPointsHandleState::Hover - } - - pub fn is_dragging(&self) -> bool { - self.handle_state == NumberOfPointsHandleState::Dragging - } - - pub fn handle_actions( - &mut self, - document: &DocumentMessageHandler, - input: &InputPreprocessorMessageHandler, - mouse_position: DVec2, - overlay_context: &mut OverlayContext, - responses: &mut VecDeque, - ) { - if input.keyboard.key(Key::Control) { - return; - } - - match &self.handle_state { - NumberOfPointsHandleState::Inactive => { - let selected_nodes = document.network_interface.selected_nodes(); - let layers = selected_nodes.selected_visible_and_unlocked_layers(&document.network_interface).filter(|layer| { - graph_modification_utils::get_star_id(*layer, &document.network_interface).is_some() || graph_modification_utils::get_polygon_id(*layer, &document.network_interface).is_some() - }); - for layer in layers { - if let Some((n, radius1, radius2)) = extract_star_parameters(Some(layer), document) { - let viewport = document.metadata().transform_to_viewport(layer); - let center = viewport.transform_point2(DVec2::ZERO); - - let point_on_max_radius = star_vertex_position(viewport, 0, n, radius1, radius2); - - if mouse_position.distance(center) < NUMBER_OF_POINTS_HANDLE_SPOKE_LENGTH && point_on_max_radius.distance(center) > GIZMO_HIDE_THRESHOLD { - self.layer = Some(layer); - self.initial_points = n; - self.update_state(NumberOfPointsHandleState::Hover); - responses.add(FrontendMessage::UpdateMouseCursor { cursor: MouseCursorIcon::EWResize }); - } - } - - if let Some((n, radius)) = extract_polygon_parameters(Some(layer), document) { - let viewport = document.metadata().transform_to_viewport(layer); - let center = viewport.transform_point2(DVec2::ZERO); - - let point_on_max_radius = polygon_vertex_position(viewport, 0, n, radius); - - if mouse_position.distance(center) < NUMBER_OF_POINTS_HANDLE_SPOKE_LENGTH && point_on_max_radius.distance(center) > GIZMO_HIDE_THRESHOLD { - self.layer = Some(layer); - self.initial_points = n; - self.update_state(NumberOfPointsHandleState::Hover); - responses.add(FrontendMessage::UpdateMouseCursor { cursor: MouseCursorIcon::EWResize }); - } - } - } - } - NumberOfPointsHandleState::Hover | NumberOfPointsHandleState::Dragging => { - let Some(layer) = self.layer else { return }; - - let Some((n, radius)) = extract_star_parameters(Some(layer), document) - .map(|(n, r1, r2)| (n, r1.max(r2))) - .or_else(|| extract_polygon_parameters(Some(layer), document)) - else { - return; - }; - - let viewport = document.metadata().transform_to_viewport(layer); - let center = viewport.transform_point2(DVec2::ZERO); - - if mouse_position.distance(center) > NUMBER_OF_POINTS_HANDLE_SPOKE_LENGTH && matches!(&self.handle_state, NumberOfPointsHandleState::Hover) { - self.update_state(NumberOfPointsHandleState::Inactive); - self.layer = None; - self.draw_spokes(center, viewport, n, radius, overlay_context); - responses.add(FrontendMessage::UpdateMouseCursor { cursor: MouseCursorIcon::Default }); - } - } - } - } - - pub fn overlays( - &mut self, - document: &DocumentMessageHandler, - input: &InputPreprocessorMessageHandler, - shape_editor: &mut &mut ShapeState, - mouse_position: DVec2, - overlay_context: &mut OverlayContext, - ) { - if input.keyboard.key(Key::Control) { - return; - } - - match &self.handle_state { - NumberOfPointsHandleState::Inactive => { - let selected_nodes = document.network_interface.selected_nodes(); - let layers = selected_nodes.selected_visible_and_unlocked_layers(&document.network_interface).filter(|layer| { - graph_modification_utils::get_star_id(*layer, &document.network_interface).is_some() || graph_modification_utils::get_polygon_id(*layer, &document.network_interface).is_some() - }); - for layer in layers { - if let Some((n, radius1, radius2)) = extract_star_parameters(Some(layer), document) { - let radius = radius1.max(radius2); - let viewport = document.metadata().transform_to_viewport(layer); - let center = viewport.transform_point2(DVec2::ZERO); - - if let Some(closest_segment) = shape_editor.upper_closest_segment(&document.network_interface, mouse_position, POINT_RADIUS_HANDLE_SEGMENT_THRESHOLD) { - if closest_segment.layer() == layer { - return; - } - } - let point_on_max_radius = star_vertex_position(viewport, 0, n, radius1, radius2); - - if inside_star(viewport, n, radius1, radius2, mouse_position) && point_on_max_radius.distance(center) > GIZMO_HIDE_THRESHOLD { - self.draw_spokes(center, viewport, n, radius, overlay_context); - return; - } - } - - if let Some((n, radius)) = extract_polygon_parameters(Some(layer), document) { - let viewport = document.metadata().transform_to_viewport(layer); - let center = viewport.transform_point2(DVec2::ZERO); - - if let Some(closest_segment) = shape_editor.upper_closest_segment(&document.network_interface, mouse_position, POINT_RADIUS_HANDLE_SEGMENT_THRESHOLD) { - if closest_segment.layer() == layer { - return; - } - } - let point_on_max_radius = polygon_vertex_position(viewport, 0, n, radius); - - if inside_polygon(viewport, n, radius, mouse_position) && point_on_max_radius.distance(center) > GIZMO_HIDE_THRESHOLD { - self.draw_spokes(center, viewport, n, radius, overlay_context); - return; - } - } - } - } - NumberOfPointsHandleState::Hover | NumberOfPointsHandleState::Dragging => { - let Some(layer) = self.layer else { return }; - - let Some((n, radius)) = extract_star_parameters(Some(layer), document) - .map(|(n, r1, r2)| (n, r1.max(r2))) - .or_else(|| extract_polygon_parameters(Some(layer), document)) - else { - return; - }; - - let viewport = document.metadata().transform_to_viewport(layer); - let center = viewport.transform_point2(DVec2::ZERO); - - self.draw_spokes(center, viewport, n, radius, overlay_context); - } - } - } - - fn draw_spokes(&self, center: DVec2, viewport: DAffine2, n: u32, radius: f64, overlay_context: &mut OverlayContext) { - for i in 0..n { - let angle = ((i as f64) * TAU) / (n as f64); - - let point = viewport.transform_point2(DVec2 { - x: radius * angle.sin(), - y: -radius * angle.cos(), - }); - - let Some(direction) = (point - center).try_normalize() else { continue }; - - // If the user zooms out such that shape is very small hide the gizmo - if point.distance(center) < GIZMO_HIDE_THRESHOLD { - return; - } - - let end_point = direction * NUMBER_OF_POINTS_HANDLE_SPOKE_LENGTH; - if matches!(self.handle_state, NumberOfPointsHandleState::Hover | NumberOfPointsHandleState::Dragging) { - overlay_context.line(center, end_point * NUMBER_OF_POINTS_HANDLE_SPOKE_EXTENSION + center, None, None); - } else { - overlay_context.line(center, end_point + center, None, None); - } - } - } - - pub fn update_number_of_sides(&self, document: &DocumentMessageHandler, input: &InputPreprocessorMessageHandler, responses: &mut VecDeque, drag_start: DVec2) { - let delta = input.mouse.position - document.metadata().document_to_viewport.transform_point2(drag_start); - let sign = (input.mouse.position.x - document.metadata().document_to_viewport.transform_point2(drag_start).x).signum(); - let net_delta = (delta.length() / 25.).round() * sign; - - let Some(layer) = self.layer else { return }; - let Some(node_id) = graph_modification_utils::get_star_id(layer, &document.network_interface).or(graph_modification_utils::get_polygon_id(layer, &document.network_interface)) else { - return; - }; - - let new_point_count = ((self.initial_points as i32) + (net_delta as i32)).max(3); - - responses.add(NodeGraphMessage::SetInput { - input_connector: InputConnector::node(node_id, 1), - input: NodeInput::value(TaggedValue::U32(new_point_count as u32), false), - }); - responses.add(NodeGraphMessage::RunDocumentGraph); - } -} diff --git a/editor/src/messages/tool/common_functionality/shapes/polygon_shape.rs b/editor/src/messages/tool/common_functionality/shapes/polygon_shape.rs index 871cf2c0b2..82dcf10cfc 100644 --- a/editor/src/messages/tool/common_functionality/shapes/polygon_shape.rs +++ b/editor/src/messages/tool/common_functionality/shapes/polygon_shape.rs @@ -3,15 +3,98 @@ use super::shape_utility::update_radius_sign; use super::*; use crate::messages::portfolio::document::graph_operation::utility_types::TransformIn; use crate::messages::portfolio::document::node_graph::document_node_definitions::resolve_document_node_type; +use crate::messages::portfolio::document::overlays::utility_types::OverlayContext; use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier; use crate::messages::portfolio::document::utility_types::network_interface::{InputConnector, NodeTemplate}; +use crate::messages::tool::common_functionality::gizmos::shape_gizmos::number_of_points_dial::NumberOfPointsDial; +use crate::messages::tool::common_functionality::gizmos::shape_gizmos::number_of_points_dial::NumberOfPointsDialState; +use crate::messages::tool::common_functionality::gizmos::shape_gizmos::point_radius_handle::PointRadiusHandle; +use crate::messages::tool::common_functionality::gizmos::shape_gizmos::point_radius_handle::PointRadiusHandleState; use crate::messages::tool::common_functionality::graph_modification_utils; +use crate::messages::tool::common_functionality::shape_editor::ShapeState; +use crate::messages::tool::common_functionality::shapes::shape_utility::ShapeGizmoHandler; +use crate::messages::tool::common_functionality::shapes::shape_utility::polygon_outline; use crate::messages::tool::tool_messages::tool_prelude::*; use glam::DAffine2; use graph_craft::document::NodeInput; use graph_craft::document::value::TaggedValue; use std::collections::VecDeque; +#[derive(Clone, Debug, Default)] +pub struct PolygonGizmoHandler { + number_of_points_dial: NumberOfPointsDial, + point_radius_handle: PointRadiusHandle, +} + +impl ShapeGizmoHandler for PolygonGizmoHandler { + fn is_any_gizmo_hovered(&self) -> bool { + self.number_of_points_dial.is_hovering() || self.point_radius_handle.hovered() + } + + fn handle_state(&mut self, selected_star_layer: LayerNodeIdentifier, mouse_position: DVec2, document: &DocumentMessageHandler, responses: &mut VecDeque) { + self.number_of_points_dial.handle_actions(selected_star_layer, mouse_position, document, responses); + self.point_radius_handle.handle_actions(selected_star_layer, document, mouse_position, responses); + } + + fn handle_click(&mut self) { + if self.number_of_points_dial.is_hovering() { + self.number_of_points_dial.update_state(NumberOfPointsDialState::Dragging); + return; + } + + if self.point_radius_handle.hovered() { + self.point_radius_handle.update_state(PointRadiusHandleState::Dragging); + } + } + + fn handle_update(&mut self, drag_start: DVec2, document: &DocumentMessageHandler, input: &InputPreprocessorMessageHandler, responses: &mut VecDeque) { + if self.number_of_points_dial.is_dragging() { + self.number_of_points_dial.update_number_of_sides(document, input, responses, drag_start); + } + + if self.point_radius_handle.is_dragging_or_snapped() { + self.point_radius_handle.update_inner_radius(document, input, responses, drag_start); + } + } + + fn overlays( + &self, + document: &DocumentMessageHandler, + selected_polygon_layer: Option, + input: &InputPreprocessorMessageHandler, + shape_editor: &mut &mut ShapeState, + mouse_position: DVec2, + overlay_context: &mut OverlayContext, + ) { + self.number_of_points_dial.overlays(document, selected_polygon_layer, shape_editor, mouse_position, overlay_context); + self.point_radius_handle.overlays(selected_polygon_layer, document, input, mouse_position, overlay_context); + + polygon_outline(selected_polygon_layer, document, overlay_context); + } + + fn dragging_overlays( + &self, + document: &DocumentMessageHandler, + input: &InputPreprocessorMessageHandler, + shape_editor: &mut &mut ShapeState, + mouse_position: DVec2, + overlay_context: &mut OverlayContext, + ) { + if self.number_of_points_dial.is_dragging() { + self.number_of_points_dial.overlays(document, None, shape_editor, mouse_position, overlay_context); + } + + if self.point_radius_handle.is_dragging_or_snapped() { + self.point_radius_handle.overlays(None, document, input, mouse_position, overlay_context); + } + } + + fn cleanup(&mut self) { + self.number_of_points_dial.cleanup(); + self.point_radius_handle.cleanup(); + } +} + #[derive(Default)] pub struct Polygon; diff --git a/editor/src/messages/tool/common_functionality/shapes/shape_utility.rs b/editor/src/messages/tool/common_functionality/shapes/shape_utility.rs index 772991be4b..be61c9764b 100644 --- a/editor/src/messages/tool/common_functionality/shapes/shape_utility.rs +++ b/editor/src/messages/tool/common_functionality/shapes/shape_utility.rs @@ -3,8 +3,9 @@ use crate::messages::message::Message; use crate::messages::portfolio::document::overlays::utility_types::OverlayContext; use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier; use crate::messages::portfolio::document::utility_types::network_interface::InputConnector; -use crate::messages::prelude::{DocumentMessageHandler, NodeGraphMessage, Responses}; +use crate::messages::prelude::{DocumentMessageHandler, InputPreprocessorMessageHandler, NodeGraphMessage, Responses}; use crate::messages::tool::common_functionality::graph_modification_utils::NodeGraphLayer; +use crate::messages::tool::common_functionality::shape_editor::ShapeState; use crate::messages::tool::common_functionality::transformation_cage::BoundingBoxManager; use crate::messages::tool::tool_messages::tool_prelude::Key; use crate::messages::tool::utility_types::*; @@ -70,9 +71,62 @@ impl ShapeType { } } -/// Center, Lock Ratio, Lock Angle, Snap Angle, Increase/Decrease Side pub type ShapeToolModifierKey = [Key; 4]; +/// The `ShapeGizmoHandler` trait defines the interactive behavior and overlay logic for shape-specific tools in the editor. +/// A gizmo is a visual handle or control point used to manipulate a shape's properties (e.g., number of sides, radius, angle). +pub trait ShapeGizmoHandler { + /// Called every frame to update the gizmo's interaction state based on the mouse position and selection. + /// + /// This includes detecting hover states and preparing interaction flags or visual feedback (e.g., highlighting a hovered handle). + fn handle_state(&mut self, selected_shape_layers: LayerNodeIdentifier, mouse_position: DVec2, document: &DocumentMessageHandler, responses: &mut VecDeque); + + /// Called when a mouse click occurs over the canvas and a gizmo handle is hovered. + /// + /// Used to initiate drag interactions or toggle states on the handle, depending on the tool. + /// For example, a hovered "number of points" handle might enter a "Dragging" state. + fn handle_click(&mut self); + + /// Called during a drag interaction to update the shape's parameters in real time. + /// + /// For example, a handle might calculate the distance from the drag start to determine a new radius or update the number of points. + fn handle_update(&mut self, drag_start: DVec2, document: &DocumentMessageHandler, input: &InputPreprocessorMessageHandler, responses: &mut VecDeque); + + /// Draws the static or hover-dependent overlays associated with the gizmo. + /// + /// These overlays include visual indicators like shape outlines, control points, and hover highlights. + fn overlays( + &self, + document: &DocumentMessageHandler, + selected_shape_layers: Option, + input: &InputPreprocessorMessageHandler, + shape_editor: &mut &mut ShapeState, + mouse_position: DVec2, + overlay_context: &mut OverlayContext, + ); + + /// Draws overlays specifically during a drag operation. + /// + /// Used to give real-time visual feedback based on drag progress, such as showing the updated shape preview or snapping guides. + fn dragging_overlays( + &self, + document: &DocumentMessageHandler, + input: &InputPreprocessorMessageHandler, + shape_editor: &mut &mut ShapeState, + mouse_position: DVec2, + overlay_context: &mut OverlayContext, + ); + + /// Returns `true` if any handle or control point in the gizmo is currently being hovered. + fn is_any_gizmo_hovered(&self) -> bool; + + /// Resets or clears any internal state maintained by the gizmo when it is no longer active. + /// + /// For example, dragging states or hover flags should be cleared to avoid visual glitches when switching tools or shapes. + fn cleanup(&mut self); +} + +/// Center, Lock Ratio, Lock Angle, Snap Angle, Increase/Decrease Side pub fn update_radius_sign(end: DVec2, start: DVec2, layer: LayerNodeIdentifier, document: &DocumentMessageHandler, responses: &mut VecDeque) { let sign_num = if end[1] > start[1] { 1. } else { -1. }; let new_layer = NodeGraphLayer::new(layer, &document.network_interface); @@ -154,19 +208,22 @@ pub fn anchor_overlays(document: &DocumentMessageHandler, overlay_context: &mut } } -/// Extract the node input values of Star +/// Extract the node input values of Star. +/// Returns an option of (sides, radius1, radius2). pub fn extract_star_parameters(layer: Option, document: &DocumentMessageHandler) -> Option<(u32, f64, f64)> { let node_inputs = NodeGraphLayer::new(layer?, &document.network_interface).find_node_inputs("Star")?; - let (Some(&TaggedValue::U32(n)), Some(&TaggedValue::F64(outer)), Some(&TaggedValue::F64(inner))) = (node_inputs.get(1)?.as_value(), node_inputs.get(2)?.as_value(), node_inputs.get(3)?.as_value()) + let (Some(&TaggedValue::U32(sides)), Some(&TaggedValue::F64(radius_1)), Some(&TaggedValue::F64(radius_2))) = + (node_inputs.get(1)?.as_value(), node_inputs.get(2)?.as_value(), node_inputs.get(3)?.as_value()) else { return None; }; - Some((n, outer, inner)) + Some((sides, radius_1, radius_2)) } -/// Extract the node input values of Polygon +/// Extract the node input values of Polygon. +/// Returns an option of (sides, radius). pub fn extract_polygon_parameters(layer: Option, document: &DocumentMessageHandler) -> Option<(u32, f64)> { let node_inputs = NodeGraphLayer::new(layer?, &document.network_interface).find_node_inputs("Regular Polygon")?; @@ -188,7 +245,7 @@ pub fn star_vertex_position(viewport: DAffine2, vertex_index: i32, n: u32, radiu }) } -/// Calculate the viewport position of as a polygon vertex given its index +/// Calculate the viewport position of a polygon vertex given its index pub fn polygon_vertex_position(viewport: DAffine2, vertex_index: i32, n: u32, radius: f64) -> DVec2 { let angle = ((vertex_index as f64) * TAU) / (n as f64); @@ -198,49 +255,37 @@ pub fn polygon_vertex_position(viewport: DAffine2, vertex_index: i32, n: u32, ra }) } -/// Outlines the geometric shape made by the Star node -pub fn star_outline(layer: LayerNodeIdentifier, document: &DocumentMessageHandler, overlay_context: &mut OverlayContext) { - let mut anchors = Vec::new(); - let Some((n, radius1, radius2)) = extract_star_parameters(Some(layer), document) else { return }; - - let viewport = document.metadata().transform_to_viewport(layer); - for i in 0..2 * n { - let angle = ((i as f64) * PI) / (n as f64); - let radius = if i % 2 == 0 { radius1 } else { radius2 }; - - let point = DVec2 { - x: radius * angle.sin(), - y: -radius * angle.cos(), - }; - - anchors.push(point); - } - - let subpath = [ClickTargetType::Subpath(Subpath::from_anchors_linear(anchors, true))]; - overlay_context.outline(subpath.iter(), viewport, None); -} - -/// Outlines the geometric shape made by the Polygon node -pub fn polygon_outline(layer: LayerNodeIdentifier, document: &DocumentMessageHandler, overlay_context: &mut OverlayContext) { - let mut anchors = Vec::new(); - - let Some((n, radius)) = extract_polygon_parameters(Some(layer), document) else { +/// Outlines the geometric shape made by star-node +pub fn star_outline(layer: Option, document: &DocumentMessageHandler, overlay_context: &mut OverlayContext) { + let Some(layer) = layer else { return }; + let Some((sides, radius1, radius2)) = extract_star_parameters(Some(layer), document) else { return; }; let viewport = document.metadata().transform_to_viewport(layer); - for i in 0..2 * n { - let angle = ((i as f64) * TAU) / (n as f64); - let point = DVec2 { - x: radius * angle.sin(), - y: -radius * angle.cos(), - }; + let points = sides as u64; + let diameter: f64 = radius1 * 2.; + let inner_diameter = radius2 * 2.; - anchors.push(point); - } + let subpath: Vec = vec![ClickTargetType::Subpath(Subpath::new_star_polygon(DVec2::splat(-diameter), points, diameter, inner_diameter))]; - let subpath: Vec = vec![ClickTargetType::Subpath(Subpath::from_anchors_linear(anchors, true))]; + overlay_context.outline(subpath.iter(), viewport, None); +} + +/// Outlines the geometric shape made by polygon-node +pub fn polygon_outline(layer: Option, document: &DocumentMessageHandler, overlay_context: &mut OverlayContext) { + let Some(layer) = layer else { return }; + let Some((sides, radius)) = extract_polygon_parameters(Some(layer), document) else { + return; + }; + + let viewport = document.metadata().transform_to_viewport(layer); + + let points = sides as u64; + let radius: f64 = radius * 2.; + + let subpath: Vec = vec![ClickTargetType::Subpath(Subpath::new_regular_polygon(DVec2::splat(-radius), points, radius))]; overlay_context.outline(subpath.iter(), viewport, None); } diff --git a/editor/src/messages/tool/common_functionality/shapes/star_shape.rs b/editor/src/messages/tool/common_functionality/shapes/star_shape.rs index 21069620d8..653b22f3ba 100644 --- a/editor/src/messages/tool/common_functionality/shapes/star_shape.rs +++ b/editor/src/messages/tool/common_functionality/shapes/star_shape.rs @@ -2,9 +2,14 @@ use super::shape_utility::{ShapeToolModifierKey, update_radius_sign}; use super::*; use crate::messages::portfolio::document::graph_operation::utility_types::TransformIn; use crate::messages::portfolio::document::node_graph::document_node_definitions::resolve_document_node_type; +use crate::messages::portfolio::document::overlays::utility_types::OverlayContext; use crate::messages::portfolio::document::utility_types::document_metadata::LayerNodeIdentifier; use crate::messages::portfolio::document::utility_types::network_interface::{InputConnector, NodeTemplate}; +use crate::messages::tool::common_functionality::gizmos::shape_gizmos::number_of_points_dial::{NumberOfPointsDial, NumberOfPointsDialState}; +use crate::messages::tool::common_functionality::gizmos::shape_gizmos::point_radius_handle::{PointRadiusHandle, PointRadiusHandleState}; use crate::messages::tool::common_functionality::graph_modification_utils; +use crate::messages::tool::common_functionality::shape_editor::ShapeState; +use crate::messages::tool::common_functionality::shapes::shape_utility::{ShapeGizmoHandler, star_outline}; use crate::messages::tool::tool_messages::tool_prelude::*; use core::f64; use glam::DAffine2; @@ -12,6 +17,81 @@ use graph_craft::document::NodeInput; use graph_craft::document::value::TaggedValue; use std::collections::VecDeque; +#[derive(Clone, Debug, Default)] +pub struct StarGizmoHandler { + number_of_points_dial: NumberOfPointsDial, + point_radius_handle: PointRadiusHandle, +} + +impl ShapeGizmoHandler for StarGizmoHandler { + fn is_any_gizmo_hovered(&self) -> bool { + self.number_of_points_dial.is_hovering() || self.point_radius_handle.hovered() + } + + fn handle_state(&mut self, selected_star_layer: LayerNodeIdentifier, mouse_position: DVec2, document: &DocumentMessageHandler, responses: &mut VecDeque) { + self.number_of_points_dial.handle_actions(selected_star_layer, mouse_position, document, responses); + self.point_radius_handle.handle_actions(selected_star_layer, document, mouse_position, responses); + } + + fn handle_click(&mut self) { + if self.number_of_points_dial.is_hovering() { + self.number_of_points_dial.update_state(NumberOfPointsDialState::Dragging); + return; + } + + if self.point_radius_handle.hovered() { + self.point_radius_handle.update_state(PointRadiusHandleState::Dragging); + } + } + + fn handle_update(&mut self, drag_start: DVec2, document: &DocumentMessageHandler, input: &InputPreprocessorMessageHandler, responses: &mut VecDeque) { + if self.number_of_points_dial.is_dragging() { + self.number_of_points_dial.update_number_of_sides(document, input, responses, drag_start); + } + + if self.point_radius_handle.is_dragging_or_snapped() { + self.point_radius_handle.update_inner_radius(document, input, responses, drag_start); + } + } + + fn overlays( + &self, + document: &DocumentMessageHandler, + selected_star_layer: Option, + input: &InputPreprocessorMessageHandler, + shape_editor: &mut &mut ShapeState, + mouse_position: DVec2, + overlay_context: &mut OverlayContext, + ) { + self.number_of_points_dial.overlays(document, selected_star_layer, shape_editor, mouse_position, overlay_context); + self.point_radius_handle.overlays(selected_star_layer, document, input, mouse_position, overlay_context); + + star_outline(selected_star_layer, document, overlay_context); + } + + fn dragging_overlays( + &self, + document: &DocumentMessageHandler, + input: &InputPreprocessorMessageHandler, + shape_editor: &mut &mut ShapeState, + mouse_position: DVec2, + overlay_context: &mut OverlayContext, + ) { + if self.number_of_points_dial.is_dragging() { + self.number_of_points_dial.overlays(document, None, shape_editor, mouse_position, overlay_context); + } + + if self.point_radius_handle.is_dragging_or_snapped() { + self.point_radius_handle.overlays(None, document, input, mouse_position, overlay_context); + } + } + + fn cleanup(&mut self) { + self.number_of_points_dial.cleanup(); + self.point_radius_handle.cleanup(); + } +} + #[derive(Default)] pub struct Star; diff --git a/editor/src/messages/tool/tool_messages/freehand_tool.rs b/editor/src/messages/tool/tool_messages/freehand_tool.rs index 1245fb430c..e2abddef2a 100644 --- a/editor/src/messages/tool/tool_messages/freehand_tool.rs +++ b/editor/src/messages/tool/tool_messages/freehand_tool.rs @@ -416,7 +416,7 @@ mod test_freehand { editor .handle_message(GraphOperationMessage::TransformSet { layer: artboard, - transform: DAffine2::from_scale_angle_translation(DVec2::new(1.5, 0.8), 0.3, DVec2::new(10.0, -5.0)), + transform: DAffine2::from_scale_angle_translation(DVec2::new(1.5, 0.8), 0.3, DVec2::new(10., -5.)), transform_in: TransformIn::Local, skip_rerender: false, }) @@ -424,14 +424,14 @@ mod test_freehand { editor.select_tool(ToolType::Freehand).await; - let mouse_points = [DVec2::new(150.0, 100.0), DVec2::new(200.0, 150.0), DVec2::new(250.0, 130.0), DVec2::new(300.0, 170.0)]; + let mouse_points = [DVec2::new(150., 100.), DVec2::new(200., 150.), DVec2::new(250., 130.), DVec2::new(300., 170.)]; // Expected points that will actually be captured by the tool let expected_captured_points = &mouse_points[1..]; editor.drag_path(&mouse_points, ModifierKeys::empty()).await; let vector_data_list = get_vector_data(&mut editor).await; - verify_path_points(&vector_data_list, expected_captured_points, 1.0).expect("Path points verification failed"); + verify_path_points(&vector_data_list, expected_captured_points, 1.).expect("Path points verification failed"); } #[tokio::test] @@ -439,7 +439,7 @@ mod test_freehand { let mut editor = EditorTestUtils::create(); editor.new_document().await; - let initial_points = [DVec2::new(100.0, 100.0), DVec2::new(200.0, 200.0), DVec2::new(300.0, 100.0)]; + let initial_points = [DVec2::new(100., 100.), DVec2::new(200., 200.), DVec2::new(300., 100.)]; editor.select_tool(ToolType::Freehand).await; @@ -491,7 +491,7 @@ mod test_freehand { assert!(endpoint_viewport_pos.is_finite(), "Endpoint position is not finite"); - let extension_points = [DVec2::new(400.0, 200.0), DVec2::new(500.0, 100.0)]; + let extension_points = [DVec2::new(400., 200.), DVec2::new(500., 100.)]; let layer_node_id = { let document = editor.active_document(); @@ -558,7 +558,7 @@ mod test_freehand { editor.select_tool(ToolType::Freehand).await; - let initial_points = [DVec2::new(100.0, 100.0), DVec2::new(200.0, 200.0), DVec2::new(300.0, 100.0)]; + let initial_points = [DVec2::new(100., 100.), DVec2::new(200., 200.), DVec2::new(300., 100.)]; let first_point = initial_points[0]; editor.move_mouse(first_point.x, first_point.y, ModifierKeys::empty(), MouseKeys::empty()).await; @@ -599,7 +599,7 @@ mod test_freehand { }) .await; - let second_path_points = [DVec2::new(400.0, 100.0), DVec2::new(500.0, 200.0), DVec2::new(600.0, 100.0)]; + let second_path_points = [DVec2::new(400., 100.), DVec2::new(500., 200.), DVec2::new(600., 100.)]; let first_second_point = second_path_points[0]; editor.move_mouse(first_second_point.x, first_second_point.y, ModifierKeys::SHIFT, MouseKeys::empty()).await; @@ -677,12 +677,12 @@ mod test_freehand { editor.select_tool(ToolType::Freehand).await; - let custom_line_weight = 5.0; + let custom_line_weight = 5.; editor .handle_message(ToolMessage::Freehand(FreehandToolMessage::UpdateOptions(FreehandOptionsUpdate::LineWeight(custom_line_weight)))) .await; - let points = [DVec2::new(100.0, 100.0), DVec2::new(200.0, 200.0), DVec2::new(300.0, 100.0)]; + let points = [DVec2::new(100., 100.), DVec2::new(200., 200.), DVec2::new(300., 100.)]; let first_point = points[0]; editor.move_mouse(first_point.x, first_point.y, ModifierKeys::empty(), MouseKeys::empty()).await; diff --git a/editor/src/messages/tool/tool_messages/gradient_tool.rs b/editor/src/messages/tool/tool_messages/gradient_tool.rs index 6265c64b1e..030da8ec1d 100644 --- a/editor/src/messages/tool/tool_messages/gradient_tool.rs +++ b/editor/src/messages/tool/tool_messages/gradient_tool.rs @@ -718,7 +718,7 @@ mod test_gradient { let mut editor = EditorTestUtils::create(); editor.new_document().await; - editor.handle_message(NavigationMessage::CanvasZoomSet { zoom_factor: 2.0 }).await; + editor.handle_message(NavigationMessage::CanvasZoomSet { zoom_factor: 2. }).await; editor.drag_tool(ToolType::Rectangle, -5., -3., 100., 100., ModifierKeys::empty()).await; @@ -727,7 +727,7 @@ mod test_gradient { editor .handle_message(GraphOperationMessage::TransformSet { layer: selected_layer, - transform: DAffine2::from_scale_angle_translation(DVec2::new(1.5, 0.8), 0.3, DVec2::new(10.0, -5.0)), + transform: DAffine2::from_scale_angle_translation(DVec2::new(1.5, 0.8), 0.3, DVec2::new(10., -5.)), transform_in: TransformIn::Local, skip_rerender: false, }) @@ -803,7 +803,7 @@ mod test_gradient { stops.sort_by(|a, b| a.0.partial_cmp(&b.0).unwrap()); let positions: Vec = stops.iter().map(|(pos, _)| *pos).collect(); - assert_stops_at_positions(&positions, &[0.0, 0.5, 1.0], 0.1); + assert_stops_at_positions(&positions, &[0., 0.5, 1.], 0.1); let middle_color = stops[1].1.to_rgba8_srgb(); @@ -843,7 +843,7 @@ mod test_gradient { // Check positions are now correctly ordered let updated_positions: Vec = updated_stops.iter().map(|(pos, _)| *pos).collect(); - assert_stops_at_positions(&updated_positions, &[0.0, 0.8, 1.0], 0.1); + assert_stops_at_positions(&updated_positions, &[0., 0.8, 1.], 0.1); // Colors should maintain their associations with the stop points assert_eq!(updated_stops[0].1.to_rgba8_srgb(), Color::BLUE.to_rgba8_srgb()); @@ -877,7 +877,7 @@ mod test_gradient { let positions: Vec = updated_gradient.stops.iter().map(|(pos, _)| *pos).collect(); // Use helper function to verify positions - assert_stops_at_positions(&positions, &[0.0, 0.25, 0.75, 1.0], 0.05); + assert_stops_at_positions(&positions, &[0., 0.25, 0.75, 1.], 0.05); // Select the stop at position 0.75 and delete it let position2 = DVec2::new(75., 0.); @@ -903,7 +903,7 @@ mod test_gradient { let final_positions: Vec = final_gradient.stops.iter().map(|(pos, _)| *pos).collect(); // Verify final positions with helper function - assert_stops_at_positions(&final_positions, &[0.0, 0.25, 1.0], 0.05); + assert_stops_at_positions(&final_positions, &[0., 0.25, 1.], 0.05); // Additional verification that 0.75 stop is gone assert!(!final_positions.iter().any(|pos| (pos - 0.75).abs() < 0.05), "Stop at position 0.75 should have been deleted"); diff --git a/editor/src/messages/tool/tool_messages/shape_tool.rs b/editor/src/messages/tool/tool_messages/shape_tool.rs index a6b79a1139..96dbc5ab01 100644 --- a/editor/src/messages/tool/tool_messages/shape_tool.rs +++ b/editor/src/messages/tool/tool_messages/shape_tool.rs @@ -6,13 +6,13 @@ use crate::messages::portfolio::document::utility_types::document_metadata::Laye use crate::messages::portfolio::document::utility_types::network_interface::InputConnector; use crate::messages::tool::common_functionality::auto_panning::AutoPanning; use crate::messages::tool::common_functionality::color_selector::{ToolColorOptions, ToolColorType}; -use crate::messages::tool::common_functionality::graph_modification_utils::{self, NodeGraphLayer}; +use crate::messages::tool::common_functionality::gizmos::gizmo_manager::GizmoManager; +use crate::messages::tool::common_functionality::graph_modification_utils; +use crate::messages::tool::common_functionality::graph_modification_utils::NodeGraphLayer; use crate::messages::tool::common_functionality::resize::Resize; -use crate::messages::tool::common_functionality::shape_gizmos::number_of_points_handle::{NumberOfPointsHandle, NumberOfPointsHandleState}; -use crate::messages::tool::common_functionality::shape_gizmos::point_radius_handle::{PointRadiusHandle, PointRadiusHandleState}; use crate::messages::tool::common_functionality::shapes::line_shape::{LineToolData, clicked_on_line_endpoints}; use crate::messages::tool::common_functionality::shapes::polygon_shape::Polygon; -use crate::messages::tool::common_functionality::shapes::shape_utility::{ShapeToolModifierKey, ShapeType, anchor_overlays, polygon_outline, star_outline, transform_cage_overlays}; +use crate::messages::tool::common_functionality::shapes::shape_utility::{ShapeToolModifierKey, ShapeType, anchor_overlays, transform_cage_overlays}; use crate::messages::tool::common_functionality::shapes::star_shape::Star; use crate::messages::tool::common_functionality::shapes::{Ellipse, Line, Rectangle}; use crate::messages::tool::common_functionality::snapping::{self, SnapCandidatePoint, SnapData, SnapTypeConfiguration}; @@ -22,6 +22,8 @@ use graph_craft::document::value::TaggedValue; use graph_craft::document::{NodeId, NodeInput}; use graphene_std::Color; use graphene_std::renderer::Quad; +use graphene_std::vector::misc::ArcType; +use std::vec; #[derive(Default)] pub struct ShapeTool { @@ -36,6 +38,7 @@ pub struct ShapeToolOptions { stroke: ToolColorOptions, vertices: u32, shape_type: ShapeType, + arc_type: ArcType, } impl Default for ShapeToolOptions { @@ -44,8 +47,9 @@ impl Default for ShapeToolOptions { line_weight: DEFAULT_STROKE_WIDTH, fill: ToolColorOptions::new_secondary(), stroke: ToolColorOptions::new_primary(), - shape_type: ShapeType::Polygon, vertices: 5, + shape_type: ShapeType::Polygon, + arc_type: ArcType::Open, } } } @@ -60,6 +64,7 @@ pub enum ShapeOptionsUpdate { WorkingColors(Option, Option), Vertices(u32), ShapeType(ShapeType), + ArcType(ArcType), } #[impl_message(Message, ToolMessage, Shape)] @@ -195,6 +200,9 @@ impl<'a> MessageHandler> for ShapeTo ShapeOptionsUpdate::Vertices(vertices) => { self.options.vertices = vertices; } + ShapeOptionsUpdate::ArcType(arc_type) => { + self.options.arc_type = arc_type; + } } self.fsm_state.update_hints(responses); @@ -217,8 +225,7 @@ impl<'a> MessageHandler> for ShapeTo | ShapeToolFsmState::ResizingBounds | ShapeToolFsmState::DraggingLineEndpoints | ShapeToolFsmState::RotatingBounds - | ShapeToolFsmState::DraggingStarInnerRadius - | ShapeToolFsmState::DraggingStarNumberPointHandle + | ShapeToolFsmState::ModifyingGizmo | ShapeToolFsmState::SkewingBounds { .. } => { actions!(ShapeToolMessageDiscriminant; DragStop, @@ -263,12 +270,9 @@ pub enum ShapeToolFsmState { Ready(ShapeType), Drawing(ShapeType), - // Line shape-specific + // Gizmos DraggingLineEndpoints, - - // Star shape-specific - DraggingStarInnerRadius, - DraggingStarNumberPointHandle, + ModifyingGizmo, // Transform cage ResizingBounds, @@ -306,9 +310,8 @@ pub struct ShapeToolData { // Current shape which is being drawn current_shape: ShapeType, - // Gizmo data - pub point_radius_handle: PointRadiusHandle, - pub number_of_points_handle: NumberOfPointsHandle, + // Gizmos + gizmo_manger: GizmoManager, } impl ShapeToolData { @@ -324,26 +327,6 @@ impl ShapeToolData { } } } - - fn outlines(&self, document: &DocumentMessageHandler, overlay_context: &mut OverlayContext) { - if let Some(layer) = self.number_of_points_handle.layer.or(self.point_radius_handle.layer) { - star_outline(layer, document, overlay_context); - polygon_outline(layer, document, overlay_context); - return; - } - - // Fallback: apply to all selected visible & unlocked star layers - for layer in document - .network_interface - .selected_nodes() - .selected_visible_and_unlocked_layers(&document.network_interface) - .filter(|layer| { - graph_modification_utils::get_star_id(*layer, &document.network_interface).is_some() || graph_modification_utils::get_polygon_id(*layer, &document.network_interface).is_some() - }) { - star_outline(layer, document, overlay_context); - polygon_outline(layer, document, overlay_context); - } - } } impl Fsm for ShapeToolFsmState { @@ -382,30 +365,24 @@ impl Fsm for ShapeToolFsmState { .map(|pos| document.metadata().document_to_viewport.transform_point2(pos)) .unwrap_or(input.mouse.position); let is_resizing_or_rotating = matches!(self, ShapeToolFsmState::ResizingBounds | ShapeToolFsmState::SkewingBounds { .. } | ShapeToolFsmState::RotatingBounds); - let dragging_start_gizmos = matches!(self, Self::DraggingStarInnerRadius); - if matches!(self, ShapeToolFsmState::DraggingStarInnerRadius | Self::DraggingStarNumberPointHandle | Self::Ready(_)) && !input.keyboard.key(Key::Control) { - // Manage state handling of the number of point gizmos - tool_data.number_of_points_handle.handle_actions(document, input, mouse_position, &mut overlay_context, responses); - - // Manage state handling of point radius handle gizmo - tool_data.point_radius_handle.handle_actions(document, mouse_position); - - tool_data.number_of_points_handle.overlays(document, input, shape_editor, mouse_position, &mut overlay_context); - tool_data - .point_radius_handle - .overlays(tool_data.number_of_points_handle.layer.is_some(), document, input, mouse_position, &mut overlay_context); - tool_data.outlines(document, &mut overlay_context); + if matches!(self, Self::Ready(_)) && !input.keyboard.key(Key::Control) { + tool_data.gizmo_manger.handle_actions(mouse_position, document, responses); + tool_data.gizmo_manger.overlays(document, input, shape_editor, mouse_position, &mut overlay_context); } - let hovered = tool_data.number_of_points_handle.is_hovering() || tool_data.number_of_points_handle.is_dragging() || !tool_data.point_radius_handle.is_inactive(); - let modifying_transform_cage = matches!(self, ShapeToolFsmState::ResizingBounds | ShapeToolFsmState::RotatingBounds | ShapeToolFsmState::SkewingBounds { .. }); + if matches!(self, ShapeToolFsmState::ModifyingGizmo) && !input.keyboard.key(Key::Control) { + tool_data.gizmo_manger.dragging_overlays(document, input, shape_editor, mouse_position, &mut overlay_context); + } - if !is_resizing_or_rotating && !dragging_start_gizmos && !hovered && !modifying_transform_cage { + let modifying_transform_cage = matches!(self, ShapeToolFsmState::ResizingBounds | ShapeToolFsmState::RotatingBounds | ShapeToolFsmState::SkewingBounds { .. }); + let hovering_over_gizmo = tool_data.gizmo_manger.hovering_over_gizmo(); + + if !is_resizing_or_rotating && !matches!(self, ShapeToolFsmState::ModifyingGizmo) && !modifying_transform_cage && !hovering_over_gizmo { tool_data.data.snap_manager.draw_overlays(SnapData::new(document, input), &mut overlay_context); } - if modifying_transform_cage { + if modifying_transform_cage && !matches!(self, ShapeToolFsmState::ModifyingGizmo) { transform_cage_overlays(document, tool_data, &mut overlay_context); } @@ -418,7 +395,9 @@ impl Fsm for ShapeToolFsmState { return self; } - transform_cage_overlays(document, tool_data, &mut overlay_context); + if !hovering_over_gizmo { + transform_cage_overlays(document, tool_data, &mut overlay_context); + } let dragging_bounds = tool_data .bounding_box_manager @@ -430,10 +409,10 @@ impl Fsm for ShapeToolFsmState { let edges = bounds.check_selected_edges(input.mouse.position); let is_skewing = matches!(self, ShapeToolFsmState::SkewingBounds { .. }); let is_near_square = edges.is_some_and(|hover_edge| bounds.over_extended_edge_midpoint(input.mouse.position, hover_edge)); - if is_skewing || (dragging_bounds && is_near_square && !is_resizing_or_rotating) { + if is_skewing || (dragging_bounds && is_near_square && !is_resizing_or_rotating && !hovering_over_gizmo) { bounds.render_skew_gizmos(&mut overlay_context, tool_data.skew_edge); } - if !is_skewing && dragging_bounds { + if !is_skewing && dragging_bounds && !hovering_over_gizmo { if let Some(edges) = edges { tool_data.skew_edge = bounds.get_closest_edge(edges, input.mouse.position); } @@ -559,28 +538,9 @@ impl Fsm for ShapeToolFsmState { tool_data.line_data.drag_current = mouse_pos; - // Check if dragging the inner vertices of a star - if tool_data.point_radius_handle.hovered() { - tool_data.last_mouse_position = mouse_pos; - tool_data.point_radius_handle.update_state(PointRadiusHandleState::Dragging); - - // Always store it in document space + if tool_data.gizmo_manger.handle_click() { tool_data.data.drag_start = document.metadata().document_to_viewport.inverse().transform_point2(mouse_pos); - - responses.add(DocumentMessage::StartTransaction); - return ShapeToolFsmState::DraggingStarInnerRadius; - } - - // Check if dragging the number of points handle of a star or polygon - if tool_data.number_of_points_handle.is_hovering() { - tool_data.last_mouse_position = mouse_pos; - tool_data.number_of_points_handle.update_state(NumberOfPointsHandleState::Dragging); - - // Always store it in document space - tool_data.data.drag_start = document.metadata().document_to_viewport.inverse().transform_point2(mouse_pos); - - responses.add(DocumentMessage::StartTransaction); - return ShapeToolFsmState::DraggingStarNumberPointHandle; + return ShapeToolFsmState::ModifyingGizmo; } // If clicked on endpoints of a selected line, drag its endpoints @@ -653,13 +613,13 @@ impl Fsm for ShapeToolFsmState { tool_options.fill.apply_fill(layer, responses); } ShapeType::Line => { - tool_data.line_data.angle = 0.; tool_data.line_data.weight = tool_options.line_weight; tool_data.line_data.editing_layer = Some(layer); } } tool_options.stroke.apply_stroke(tool_options.line_weight, layer, responses); + tool_options.stroke.apply_stroke(tool_options.line_weight, layer, responses); tool_data.data.layer = Some(layer); ShapeToolFsmState::Drawing(tool_data.current_shape) @@ -695,23 +655,13 @@ impl Fsm for ShapeToolFsmState { self } - (ShapeToolFsmState::DraggingStarInnerRadius, ShapeToolMessage::PointerMove(..)) => { - if let Some(layer) = tool_data.point_radius_handle.layer { - tool_data.point_radius_handle.update_inner_radius(document, input, layer, responses, tool_data.data.drag_start); - tool_data.last_mouse_position = input.mouse.position; - } + (ShapeToolFsmState::ModifyingGizmo, ShapeToolMessage::PointerMove(..)) => { + responses.add(DocumentMessage::StartTransaction); + tool_data.gizmo_manger.handle_update(tool_data.data.drag_start, document, input, responses); responses.add(OverlaysMessage::Draw); - ShapeToolFsmState::DraggingStarInnerRadius - } - (ShapeToolFsmState::DraggingStarNumberPointHandle, ShapeToolMessage::PointerMove(..)) => { - tool_data.number_of_points_handle.update_number_of_sides(document, input, responses, tool_data.data.drag_start); - - tool_data.last_mouse_position = input.mouse.position; - responses.add(OverlaysMessage::Draw); - - ShapeToolFsmState::DraggingStarNumberPointHandle + ShapeToolFsmState::ModifyingGizmo } (ShapeToolFsmState::ResizingBounds, ShapeToolMessage::PointerMove(modifier)) => { if let Some(bounds) = &mut tool_data.bounding_box_manager { @@ -773,12 +723,12 @@ impl Fsm for ShapeToolFsmState { .and_then(|bounding_box| bounding_box.check_selected_edges(input.mouse.position)) .is_some(); - let cursor = tool_data - .bounding_box_manager - .as_ref() - .map_or(MouseCursorIcon::Default, |bounds| bounds.get_cursor(input, true, dragging_bounds, Some(tool_data.skew_edge))); + let cursor = tool_data.bounding_box_manager.as_ref().map_or(MouseCursorIcon::Crosshair, |bounds| { + let cursor = bounds.get_cursor(input, true, dragging_bounds, Some(tool_data.skew_edge)); + if cursor == MouseCursorIcon::Default { MouseCursorIcon::Crosshair } else { cursor } + }); - if tool_data.cursor != cursor && !input.keyboard.key(Key::Control) && tool_data.point_radius_handle.is_inactive() && !all_selected_layers_line { + if tool_data.cursor != cursor && !input.keyboard.key(Key::Control) && !all_selected_layers_line { tool_data.cursor = cursor; responses.add(FrontendMessage::UpdateMouseCursor { cursor }); } @@ -811,15 +761,13 @@ impl Fsm for ShapeToolFsmState { | ShapeToolFsmState::ResizingBounds | ShapeToolFsmState::RotatingBounds | ShapeToolFsmState::SkewingBounds { .. } - | ShapeToolFsmState::DraggingStarInnerRadius - | ShapeToolFsmState::DraggingStarNumberPointHandle, + | ShapeToolFsmState::ModifyingGizmo, ShapeToolMessage::DragStop, ) => { input.mouse.finish_transaction(tool_data.data.drag_start, responses); tool_data.data.cleanup(responses); - tool_data.number_of_points_handle.cleanup(); - tool_data.point_radius_handle.cleanup(); + tool_data.gizmo_manger.handle_cleanup(); if let Some(bounds) = &mut tool_data.bounding_box_manager { bounds.original_transforms.clear(); @@ -837,17 +785,14 @@ impl Fsm for ShapeToolFsmState { | ShapeToolFsmState::ResizingBounds | ShapeToolFsmState::RotatingBounds | ShapeToolFsmState::SkewingBounds { .. } - | ShapeToolFsmState::DraggingStarInnerRadius - | ShapeToolFsmState::DraggingStarNumberPointHandle, + | ShapeToolFsmState::ModifyingGizmo, ShapeToolMessage::Abort, ) => { responses.add(DocumentMessage::AbortTransaction); tool_data.data.cleanup(responses); tool_data.line_data.dragging_endpoint = None; - // Reset gizmo state - tool_data.number_of_points_handle.cleanup(); - tool_data.point_radius_handle.cleanup(); + tool_data.gizmo_manger.handle_cleanup(); if let Some(bounds) = &mut tool_data.bounding_box_manager { bounds.original_transforms.clear(); @@ -952,9 +897,7 @@ impl Fsm for ShapeToolFsmState { HintGroup(vec![HintInfo::mouse(MouseMotion::Rmb, ""), HintInfo::keys([Key::Escape], "Cancel").prepend_slash()]), HintGroup(vec![HintInfo::keys([Key::Control], "Unlock Slide")]), ]), - ShapeToolFsmState::DraggingStarInnerRadius | ShapeToolFsmState::DraggingStarNumberPointHandle => { - HintData(vec![HintGroup(vec![HintInfo::mouse(MouseMotion::Rmb, ""), HintInfo::keys([Key::Escape], "Cancel").prepend_slash()])]) - } + ShapeToolFsmState::ModifyingGizmo => HintData(vec![HintGroup(vec![HintInfo::mouse(MouseMotion::Rmb, ""), HintInfo::keys([Key::Escape], "Cancel").prepend_slash()])]), }; responses.add(FrontendMessage::UpdateInputHints { hint_data }); diff --git a/editor/src/messages/tool/tool_messages/spline_tool.rs b/editor/src/messages/tool/tool_messages/spline_tool.rs index 94c8ee2dab..2ac541d702 100644 --- a/editor/src/messages/tool/tool_messages/spline_tool.rs +++ b/editor/src/messages/tool/tool_messages/spline_tool.rs @@ -656,15 +656,15 @@ mod test_spline_tool { editor.new_document().await; // Zooming the viewport - editor.handle_message(NavigationMessage::CanvasZoomSet { zoom_factor: 2.0 }).await; + editor.handle_message(NavigationMessage::CanvasZoomSet { zoom_factor: 2. }).await; // Selecting the spline tool editor.select_tool(ToolType::Spline).await; // Adding points by clicking at different positions - editor.click_tool(ToolType::Spline, MouseKeys::LEFT, DVec2::new(50.0, 50.0), ModifierKeys::empty()).await; - editor.click_tool(ToolType::Spline, MouseKeys::LEFT, DVec2::new(100.0, 50.0), ModifierKeys::empty()).await; - editor.click_tool(ToolType::Spline, MouseKeys::LEFT, DVec2::new(150.0, 100.0), ModifierKeys::empty()).await; + editor.click_tool(ToolType::Spline, MouseKeys::LEFT, DVec2::new(50., 50.), ModifierKeys::empty()).await; + editor.click_tool(ToolType::Spline, MouseKeys::LEFT, DVec2::new(100., 50.), ModifierKeys::empty()).await; + editor.click_tool(ToolType::Spline, MouseKeys::LEFT, DVec2::new(150., 100.), ModifierKeys::empty()).await; // Finish the spline editor.handle_message(SplineToolMessage::Confirm).await; @@ -686,7 +686,7 @@ mod test_spline_tool { let layer_to_viewport = document.metadata().transform_to_viewport(layer); // Expected points in viewport coordinates - let expected_points = vec![DVec2::new(50.0, 50.0), DVec2::new(100.0, 50.0), DVec2::new(150.0, 100.0)]; + let expected_points = vec![DVec2::new(50., 50.), DVec2::new(100., 50.), DVec2::new(150., 100.)]; // Assert all points are correctly positioned assert_point_positions(&vector_data, layer_to_viewport, &expected_points, 1e-10); @@ -697,15 +697,15 @@ mod test_spline_tool { let mut editor = EditorTestUtils::create(); editor.new_document().await; - let pan_amount = DVec2::new(200.0, 150.0); + let pan_amount = DVec2::new(200., 150.); editor.handle_message(NavigationMessage::CanvasPan { delta: pan_amount }).await; editor.select_tool(ToolType::Spline).await; // Add points by clicking at different positions - editor.click_tool(ToolType::Spline, MouseKeys::LEFT, DVec2::new(50.0, 50.0), ModifierKeys::empty()).await; - editor.click_tool(ToolType::Spline, MouseKeys::LEFT, DVec2::new(100.0, 50.0), ModifierKeys::empty()).await; - editor.click_tool(ToolType::Spline, MouseKeys::LEFT, DVec2::new(150.0, 100.0), ModifierKeys::empty()).await; + editor.click_tool(ToolType::Spline, MouseKeys::LEFT, DVec2::new(50., 50.), ModifierKeys::empty()).await; + editor.click_tool(ToolType::Spline, MouseKeys::LEFT, DVec2::new(100., 50.), ModifierKeys::empty()).await; + editor.click_tool(ToolType::Spline, MouseKeys::LEFT, DVec2::new(150., 100.), ModifierKeys::empty()).await; editor.handle_message(SplineToolMessage::Confirm).await; @@ -726,7 +726,7 @@ mod test_spline_tool { let layer_to_viewport = document.metadata().transform_to_viewport(layer); // Expected points in viewport coordinates - let expected_points = vec![DVec2::new(50.0, 50.0), DVec2::new(100.0, 50.0), DVec2::new(150.0, 100.0)]; + let expected_points = vec![DVec2::new(50., 50.), DVec2::new(100., 50.), DVec2::new(150., 100.)]; // Assert all points are correctly positioned assert_point_positions(&vector_data, layer_to_viewport, &expected_points, 1e-10); @@ -738,12 +738,12 @@ mod test_spline_tool { editor.new_document().await; // Tilt/rotate the viewport (45 degrees) - editor.handle_message(NavigationMessage::CanvasTiltSet { angle_radians: 45.0_f64.to_radians() }).await; + editor.handle_message(NavigationMessage::CanvasTiltSet { angle_radians: 45_f64.to_radians() }).await; editor.select_tool(ToolType::Spline).await; - editor.click_tool(ToolType::Spline, MouseKeys::LEFT, DVec2::new(50.0, 50.0), ModifierKeys::empty()).await; - editor.click_tool(ToolType::Spline, MouseKeys::LEFT, DVec2::new(100.0, 50.0), ModifierKeys::empty()).await; - editor.click_tool(ToolType::Spline, MouseKeys::LEFT, DVec2::new(150.0, 100.0), ModifierKeys::empty()).await; + editor.click_tool(ToolType::Spline, MouseKeys::LEFT, DVec2::new(50., 50.), ModifierKeys::empty()).await; + editor.click_tool(ToolType::Spline, MouseKeys::LEFT, DVec2::new(100., 50.), ModifierKeys::empty()).await; + editor.click_tool(ToolType::Spline, MouseKeys::LEFT, DVec2::new(150., 100.), ModifierKeys::empty()).await; editor.handle_message(SplineToolMessage::Confirm).await; @@ -764,7 +764,7 @@ mod test_spline_tool { let layer_to_viewport = document.metadata().transform_to_viewport(layer); // Expected points in viewport coordinates - let expected_points = vec![DVec2::new(50.0, 50.0), DVec2::new(100.0, 50.0), DVec2::new(150.0, 100.0)]; + let expected_points = vec![DVec2::new(50., 50.), DVec2::new(100., 50.), DVec2::new(150., 100.)]; // Assert all points are correctly positioned assert_point_positions(&vector_data, layer_to_viewport, &expected_points, 1e-10); @@ -777,14 +777,14 @@ mod test_spline_tool { // Applying multiple transformations editor.handle_message(NavigationMessage::CanvasZoomSet { zoom_factor: 1.5 }).await; - editor.handle_message(NavigationMessage::CanvasPan { delta: DVec2::new(100.0, 75.0) }).await; - editor.handle_message(NavigationMessage::CanvasTiltSet { angle_radians: 30.0_f64.to_radians() }).await; + editor.handle_message(NavigationMessage::CanvasPan { delta: DVec2::new(100., 75.) }).await; + editor.handle_message(NavigationMessage::CanvasTiltSet { angle_radians: 30_f64.to_radians() }).await; editor.select_tool(ToolType::Spline).await; - editor.click_tool(ToolType::Spline, MouseKeys::LEFT, DVec2::new(50.0, 50.0), ModifierKeys::empty()).await; - editor.click_tool(ToolType::Spline, MouseKeys::LEFT, DVec2::new(100.0, 50.0), ModifierKeys::empty()).await; - editor.click_tool(ToolType::Spline, MouseKeys::LEFT, DVec2::new(150.0, 100.0), ModifierKeys::empty()).await; + editor.click_tool(ToolType::Spline, MouseKeys::LEFT, DVec2::new(50., 50.), ModifierKeys::empty()).await; + editor.click_tool(ToolType::Spline, MouseKeys::LEFT, DVec2::new(100., 50.), ModifierKeys::empty()).await; + editor.click_tool(ToolType::Spline, MouseKeys::LEFT, DVec2::new(150., 100.), ModifierKeys::empty()).await; editor.handle_message(SplineToolMessage::Confirm).await; if let Err(e) = editor.eval_graph().await { @@ -803,7 +803,7 @@ mod test_spline_tool { let layer_to_viewport = document.metadata().transform_to_viewport(layer); // Expected points in viewport coordinates - let expected_points = vec![DVec2::new(50.0, 50.0), DVec2::new(100.0, 50.0), DVec2::new(150.0, 100.0)]; + let expected_points = vec![DVec2::new(50., 50.), DVec2::new(100., 50.), DVec2::new(150., 100.)]; // Assert all points are correctly positioned assert_point_positions(&vector_data, layer_to_viewport, &expected_points, 1e-10); diff --git a/editor/src/messages/tool/transform_layer/transform_layer_message_handler.rs b/editor/src/messages/tool/transform_layer/transform_layer_message_handler.rs index eab68b8866..287faf00d1 100644 --- a/editor/src/messages/tool/transform_layer/transform_layer_message_handler.rs +++ b/editor/src/messages/tool/transform_layer/transform_layer_message_handler.rs @@ -1021,8 +1021,8 @@ mod test_transform_layer { let scale_x = final_transform.matrix2.x_axis.length() / original_transform.matrix2.x_axis.length(); let scale_y = final_transform.matrix2.y_axis.length() / original_transform.matrix2.y_axis.length(); - assert!((scale_x - 2.).abs() < 0.1, "Expected scale factor X of 2.0, got: {}", scale_x); - assert!((scale_y - 2.).abs() < 0.1, "Expected scale factor Y of 2.0, got: {}", scale_y); + assert!((scale_x - 2.).abs() < 0.1, "Expected scale factor X of 2, got: {}", scale_x); + assert!((scale_y - 2.).abs() < 0.1, "Expected scale factor Y of 2, got: {}", scale_y); } #[tokio::test] @@ -1047,8 +1047,8 @@ mod test_transform_layer { let scale_x = final_transform.matrix2.x_axis.length() / original_transform.matrix2.x_axis.length(); let scale_y = final_transform.matrix2.y_axis.length() / original_transform.matrix2.y_axis.length(); - assert!((scale_x - 2.).abs() < 0.1, "Expected scale factor X of 2.0, got: {}", scale_x); - assert!((scale_y - 2.).abs() < 0.1, "Expected scale factor Y of 2.0, got: {}", scale_y); + assert!((scale_x - 2.).abs() < 0.1, "Expected scale factor X of 2, got: {}", scale_x); + assert!((scale_y - 2.).abs() < 0.1, "Expected scale factor Y of 2, got: {}", scale_y); } #[tokio::test] diff --git a/node-graph/gcore/src/vector/generator_nodes.rs b/node-graph/gcore/src/vector/generator_nodes.rs index 75cdec10e2..adab1ce531 100644 --- a/node-graph/gcore/src/vector/generator_nodes.rs +++ b/node-graph/gcore/src/vector/generator_nodes.rs @@ -119,12 +119,12 @@ fn star( #[hard_min(2.)] #[implementations(u32, u64, f64)] sides: T, - #[default(50)] radius: f64, - #[default(25)] inner_radius: f64, + #[default(50)] radius_1: f64, + #[default(25)] radius_2: f64, ) -> VectorDataTable { let points = sides.as_u64(); - let diameter: f64 = radius * 2.; - let inner_diameter = inner_radius * 2.; + let diameter: f64 = radius_1 * 2.; + let inner_diameter = radius_2 * 2.; VectorDataTable::new(VectorData::from_subpath(Subpath::new_star_polygon(DVec2::splat(-diameter), points, diameter, inner_diameter))) } From c7978777631ec25bc6908ab98daafe2f309cc025 Mon Sep 17 00:00:00 2001 From: 0SlowPoke0 <142654792+0SlowPoke0@users.noreply.github.com> Date: Fri, 27 Jun 2025 14:12:10 +0530 Subject: [PATCH 26/44] Fix regression in previous commit where node parameter updates didn't refresh the render (#2761) fix changes in propeties panel not updating --- .../portfolio/document/node_graph/node_graph_message_handler.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs index 97f46b0ac6..bd7f62dd82 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs @@ -1396,7 +1396,7 @@ impl<'a> MessageHandler> for NodeGrap input, }); responses.add(PropertiesPanelMessage::Refresh); - if (network_interface.reference(&node_id, selection_network_path).is_none() || input_index == 0) && network_interface.connected_to_output(&node_id, selection_network_path) { + if !(network_interface.reference(&node_id, selection_network_path).is_none() || input_index == 0) && network_interface.connected_to_output(&node_id, selection_network_path) { responses.add(NodeGraphMessage::RunDocumentGraph); } } From 2ddae98bcfe339e9121e0c282aceb7b2baa01ead Mon Sep 17 00:00:00 2001 From: Firestar99 Date: Fri, 27 Jun 2025 11:54:34 +0200 Subject: [PATCH 27/44] Prep `gcore` splitup: move various symbols into their own modules (#2746) * move `trait AsU32` from `gcore::vector::misc` to `gcore` * move blending and gradient to their own modules * fix unused warnings * move `Quad`, `Rect` and `BBox` to `gcore::math` * extract `ReferencePoint` and transform nodes from `transform` * move color-related code to `mod color` * fix unused warning in test code * move blending-related nodes and code to `mod blending_nodes` * move ClickTarget code to `mod vector::click_target` --- .../portfolio/document/document_message.rs | 2 +- .../document/document_message_handler.rs | 3 +- .../node_graph/document_node_definitions.rs | 18 +- .../node_graph/node_graph_message_handler.rs | 1 + .../document/overlays/utility_types.rs | 4 +- .../utility_types/document_metadata.rs | 3 +- .../utility_types/network_interface.rs | 3 +- .../messages/portfolio/document_migration.rs | 13 +- .../shapes/shape_utility.rs | 2 +- .../snapping/layer_snapper.rs | 1 + node-graph/README.md | 2 +- node-graph/gcore/src/blending.rs | 271 +++++++++++++++ node-graph/gcore/src/blending_nodes.rs | 175 ++++++++++ .../gcore/src/{raster => color}/color.rs | 34 +- node-graph/gcore/src/color/color_traits.rs | 205 +++++++++++ .../src/{raster => color}/discrete_srgb.rs | 0 node-graph/gcore/src/color/mod.rs | 7 + node-graph/gcore/src/gradient.rs | 248 ++++++++++++++ node-graph/gcore/src/graphic_element.rs | 59 +--- .../gcore/src/graphic_element/renderer.rs | 169 +-------- node-graph/gcore/src/lib.rs | 39 ++- node-graph/gcore/src/{raster => math}/bbox.rs | 0 node-graph/gcore/src/math/math_ext.rs | 25 ++ node-graph/gcore/src/math/mod.rs | 4 + .../renderer => math}/quad.rs | 5 - .../renderer => math}/rect.rs | 7 +- node-graph/gcore/src/raster.rs | 322 +----------------- node-graph/gcore/src/raster/adjustments.rs | 295 +--------------- node-graph/gcore/src/raster/image.rs | 2 +- node-graph/gcore/src/registry.rs | 2 +- node-graph/gcore/src/transform.rs | 191 +---------- node-graph/gcore/src/transform_nodes.rs | 89 +++++ node-graph/gcore/src/vector/brush_stroke.rs | 2 +- node-graph/gcore/src/vector/click_target.rs | 162 +++++++++ node-graph/gcore/src/vector/misc.rs | 9 - node-graph/gcore/src/vector/mod.rs | 3 + .../gcore/src/vector/reference_point.rs | 103 ++++++ node-graph/gcore/src/vector/style.rs | 244 +------------ node-graph/gcore/src/vector/vector_data.rs | 2 +- node-graph/gstd/src/brush.rs | 2 +- node-graph/gstd/src/raster.rs | 4 +- node-graph/gstd/src/wasm_application_io.rs | 2 +- .../interpreted-executor/src/node_registry.rs | 12 +- .../node-macro/src/derive_choice_type.rs | 2 +- 44 files changed, 1407 insertions(+), 1341 deletions(-) create mode 100644 node-graph/gcore/src/blending.rs create mode 100644 node-graph/gcore/src/blending_nodes.rs rename node-graph/gcore/src/{raster => color}/color.rs (97%) create mode 100644 node-graph/gcore/src/color/color_traits.rs rename node-graph/gcore/src/{raster => color}/discrete_srgb.rs (100%) create mode 100644 node-graph/gcore/src/color/mod.rs create mode 100644 node-graph/gcore/src/gradient.rs rename node-graph/gcore/src/{raster => math}/bbox.rs (100%) create mode 100644 node-graph/gcore/src/math/math_ext.rs create mode 100644 node-graph/gcore/src/math/mod.rs rename node-graph/gcore/src/{graphic_element/renderer => math}/quad.rs (96%) rename node-graph/gcore/src/{graphic_element/renderer => math}/rect.rs (92%) create mode 100644 node-graph/gcore/src/transform_nodes.rs create mode 100644 node-graph/gcore/src/vector/click_target.rs create mode 100644 node-graph/gcore/src/vector/reference_point.rs diff --git a/editor/src/messages/portfolio/document/document_message.rs b/editor/src/messages/portfolio/document/document_message.rs index 2a201f58fb..18ede64be8 100644 --- a/editor/src/messages/portfolio/document/document_message.rs +++ b/editor/src/messages/portfolio/document/document_message.rs @@ -11,8 +11,8 @@ use graph_craft::document::NodeId; use graphene_std::Color; use graphene_std::raster::BlendMode; use graphene_std::raster::Image; -use graphene_std::renderer::ClickTarget; use graphene_std::transform::Footprint; +use graphene_std::vector::click_target::ClickTarget; use graphene_std::vector::style::ViewMode; #[impl_message(Message, PortfolioMessage, Document)] diff --git a/editor/src/messages/portfolio/document/document_message_handler.rs b/editor/src/messages/portfolio/document/document_message_handler.rs index a4550d4ce8..9b316e07b0 100644 --- a/editor/src/messages/portfolio/document/document_message_handler.rs +++ b/editor/src/messages/portfolio/document/document_message_handler.rs @@ -29,9 +29,10 @@ use bezier_rs::Subpath; use glam::{DAffine2, DVec2, IVec2}; use graph_craft::document::value::TaggedValue; use graph_craft::document::{NodeId, NodeInput, NodeNetwork, OldNodeNetwork}; +use graphene_std::math::quad::Quad; use graphene_std::raster::BlendMode; use graphene_std::raster_types::{Raster, RasterDataTable}; -use graphene_std::renderer::{ClickTarget, ClickTargetType, Quad}; +use graphene_std::vector::click_target::{ClickTarget, ClickTargetType}; use graphene_std::vector::style::ViewMode; use graphene_std::vector::{PointId, path_bool_lib}; use std::time::Duration; diff --git a/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs b/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs index f0432906eb..98ae6c413a 100644 --- a/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs +++ b/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs @@ -166,13 +166,13 @@ fn static_nodes() -> Vec { }, DocumentNode { inputs: vec![NodeInput::node(NodeId(0), 0)], - implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::transform::FreezeRealTimeNode")), + implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::transform_nodes::FreezeRealTimeNode")), manual_composition: Some(generic!(T)), ..Default::default() }, DocumentNode { inputs: vec![NodeInput::node(NodeId(1), 0)], - implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::transform::BoundlessFootprintNode")), + implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::transform_nodes::BoundlessFootprintNode")), manual_composition: Some(generic!(T)), ..Default::default() }, @@ -1650,7 +1650,7 @@ fn static_nodes() -> Vec { NodeInput::network(concrete!(DVec2), 5), ], manual_composition: Some(concrete!(Context)), - implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::transform::TransformNode")), + implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::transform_nodes::TransformNode")), ..Default::default() }, ] @@ -1746,13 +1746,13 @@ fn static_nodes() -> Vec { }, DocumentNode { inputs: vec![NodeInput::node(NodeId(1), 0)], - implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::transform::FreezeRealTimeNode")), + implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::transform_nodes::FreezeRealTimeNode")), manual_composition: Some(generic!(T)), ..Default::default() }, DocumentNode { inputs: vec![NodeInput::node(NodeId(2), 0)], - implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::transform::BoundlessFootprintNode")), + implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::transform_nodes::BoundlessFootprintNode")), manual_composition: Some(generic!(T)), ..Default::default() }, @@ -1859,13 +1859,13 @@ fn static_nodes() -> Vec { }, DocumentNode { inputs: vec![NodeInput::node(NodeId(2), 0)], - implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::transform::FreezeRealTimeNode")), + implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::transform_nodes::FreezeRealTimeNode")), manual_composition: Some(generic!(T)), ..Default::default() }, DocumentNode { inputs: vec![NodeInput::node(NodeId(3), 0)], - implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::transform::BoundlessFootprintNode")), + implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::transform_nodes::BoundlessFootprintNode")), manual_composition: Some(generic!(T)), ..Default::default() }, @@ -2014,13 +2014,13 @@ fn static_nodes() -> Vec { }, DocumentNode { inputs: vec![NodeInput::node(NodeId(1), 0)], - implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::transform::FreezeRealTimeNode")), + implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::transform_nodes::FreezeRealTimeNode")), manual_composition: Some(generic!(T)), ..Default::default() }, DocumentNode { inputs: vec![NodeInput::node(NodeId(2), 0)], - implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::transform::BoundlessFootprintNode")), + implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::transform_nodes::BoundlessFootprintNode")), manual_composition: Some(generic!(T)), ..Default::default() }, diff --git a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs index bd7f62dd82..49256220c8 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_graph_message_handler.rs @@ -21,6 +21,7 @@ use crate::messages::tool::utility_types::{HintData, HintGroup, HintInfo}; use glam::{DAffine2, DVec2, IVec2}; use graph_craft::document::{DocumentNodeImplementation, NodeId, NodeInput}; use graph_craft::proto::GraphErrors; +use graphene_std::math::math_ext::QuadExt; use graphene_std::*; use renderer::Quad; use std::cmp::Ordering; diff --git a/editor/src/messages/portfolio/document/overlays/utility_types.rs b/editor/src/messages/portfolio/document/overlays/utility_types.rs index c1b1649baa..9587e1d637 100644 --- a/editor/src/messages/portfolio/document/overlays/utility_types.rs +++ b/editor/src/messages/portfolio/document/overlays/utility_types.rs @@ -9,8 +9,8 @@ use core::borrow::Borrow; use core::f64::consts::{FRAC_PI_2, TAU}; use glam::{DAffine2, DVec2}; use graphene_std::Color; -use graphene_std::renderer::ClickTargetType; -use graphene_std::renderer::Quad; +use graphene_std::math::quad::Quad; +use graphene_std::vector::click_target::ClickTargetType; use graphene_std::vector::{PointId, SegmentId, VectorData}; use std::collections::HashMap; use wasm_bindgen::{JsCast, JsValue}; diff --git a/editor/src/messages/portfolio/document/utility_types/document_metadata.rs b/editor/src/messages/portfolio/document/utility_types/document_metadata.rs index 8eb3defc84..23887db3e5 100644 --- a/editor/src/messages/portfolio/document/utility_types/document_metadata.rs +++ b/editor/src/messages/portfolio/document/utility_types/document_metadata.rs @@ -3,8 +3,9 @@ use crate::messages::portfolio::document::graph_operation::transform_utils; use crate::messages::portfolio::document::graph_operation::utility_types::ModifyInputsContext; use glam::{DAffine2, DVec2}; use graph_craft::document::NodeId; -use graphene_std::renderer::{ClickTarget, ClickTargetType, Quad}; +use graphene_std::math::quad::Quad; use graphene_std::transform::Footprint; +use graphene_std::vector::click_target::{ClickTarget, ClickTargetType}; use graphene_std::vector::{PointId, VectorData}; use std::collections::{HashMap, HashSet}; use std::num::NonZeroU64; diff --git a/editor/src/messages/portfolio/document/utility_types/network_interface.rs b/editor/src/messages/portfolio/document/utility_types/network_interface.rs index 640c7e64ae..04e2f0803d 100644 --- a/editor/src/messages/portfolio/document/utility_types/network_interface.rs +++ b/editor/src/messages/portfolio/document/utility_types/network_interface.rs @@ -12,8 +12,9 @@ use glam::{DAffine2, DVec2, IVec2}; use graph_craft::document::value::TaggedValue; use graph_craft::document::{DocumentNode, DocumentNodeImplementation, NodeId, NodeInput, NodeNetwork, OldDocumentNodeImplementation, OldNodeNetwork}; use graph_craft::{Type, concrete}; -use graphene_std::renderer::{ClickTarget, ClickTargetType, Quad}; +use graphene_std::math::quad::Quad; use graphene_std::transform::Footprint; +use graphene_std::vector::click_target::{ClickTarget, ClickTargetType}; use graphene_std::vector::{PointId, VectorData, VectorModificationType}; use interpreted_executor::dynamic_executor::ResolvedDocumentNodeTypes; use interpreted_executor::node_registry::NODE_REGISTRY; diff --git a/editor/src/messages/portfolio/document_migration.rs b/editor/src/messages/portfolio/document_migration.rs index 4b8f8a85f7..3d9c7d240c 100644 --- a/editor/src/messages/portfolio/document_migration.rs +++ b/editor/src/messages/portfolio/document_migration.rs @@ -14,12 +14,12 @@ use graphene_std::vector::style::{Fill, FillType, Gradient, PaintOrder, StrokeAl use graphene_std::vector::{VectorData, VectorDataTable}; use std::collections::HashMap; -const TEXT_REPLACEMENTS: [(&str, &str); 2] = [ +const TEXT_REPLACEMENTS: &[(&str, &str)] = &[ ("graphene_core::vector::vector_nodes::SamplePointsNode", "graphene_core::vector::SamplePolylineNode"), ("graphene_core::vector::vector_nodes::SubpathSegmentLengthsNode", "graphene_core::vector::SubpathSegmentLengthsNode"), ]; -const REPLACEMENTS: [(&str, &str); 40] = [ +const REPLACEMENTS: &[(&str, &str)] = &[ ("graphene_core::AddArtboardNode", "graphene_core::graphic_element::AppendArtboardNode"), ("graphene_core::ConstructArtboardNode", "graphene_core::graphic_element::ToArtboardNode"), ("graphene_core::ToGraphicElementNode", "graphene_core::graphic_element::ToElementNode"), @@ -31,6 +31,9 @@ const REPLACEMENTS: [(&str, &str); 40] = [ ("graphene_core::ops::Vector2ValueNode", "graphene_core::ops::CoordinateValueNode"), ("graphene_core::raster::BlackAndWhiteNode", "graphene_core::raster::adjustments::BlackAndWhiteNode"), ("graphene_core::raster::BlendNode", "graphene_core::raster::adjustments::BlendNode"), + ("graphene_core::raster::BlendModeNode", "graphene_core::blending_nodes::BlendModeNode"), + ("graphene_core::raster::OpacityNode", "graphene_core::blending_nodes::OpacityNode"), + ("graphene_core::raster::BlendingNode", "graphene_core::blending_nodes::BlendingNode"), ("graphene_core::raster::ChannelMixerNode", "graphene_core::raster::adjustments::ChannelMixerNode"), ("graphene_core::raster::adjustments::ColorOverlayNode", "graphene_core::raster::adjustments::ColorOverlayNode"), ("graphene_core::raster::ExposureNode", "graphene_core::raster::adjustments::ExposureNode"), @@ -48,7 +51,11 @@ const REPLACEMENTS: [(&str, &str); 40] = [ ("graphene_core::raster::ThresholdNode", "graphene_core::raster::adjustments::ThresholdNode"), ("graphene_core::raster::VibranceNode", "graphene_core::raster::adjustments::VibranceNode"), ("graphene_core::text::TextGeneratorNode", "graphene_core::text::TextNode"), - ("graphene_core::transform::SetTransformNode", "graphene_core::transform::ReplaceTransformNode"), + ("graphene_core::transform::SetTransformNode", "graphene_core::transform_nodes::ReplaceTransformNode"), + ("graphene_core::transform::ReplaceTransformNode", "graphene_core::transform_nodes::ReplaceTransformNode"), + ("graphene_core::transform::TransformNode", "graphene_core::transform_nodes::TransformNode"), + ("graphene_core::transform::BoundlessFootprintNode", "graphene_core::transform_nodes::BoundlessFootprintNode"), + ("graphene_core::transform::FreezeRealTimeNode", "graphene_core::transform_nodes::FreezeRealTimeNode"), ("graphene_core::vector::SplinesFromPointsNode", "graphene_core::vector::SplineNode"), ("graphene_core::vector::generator_nodes::EllipseGenerator", "graphene_core::vector::generator_nodes::EllipseNode"), ("graphene_core::vector::generator_nodes::LineGenerator", "graphene_core::vector::generator_nodes::LineNode"), diff --git a/editor/src/messages/tool/common_functionality/shapes/shape_utility.rs b/editor/src/messages/tool/common_functionality/shapes/shape_utility.rs index be61c9764b..955984150b 100644 --- a/editor/src/messages/tool/common_functionality/shapes/shape_utility.rs +++ b/editor/src/messages/tool/common_functionality/shapes/shape_utility.rs @@ -13,7 +13,7 @@ use bezier_rs::Subpath; use glam::{DAffine2, DMat2, DVec2}; use graph_craft::document::NodeInput; use graph_craft::document::value::TaggedValue; -use graphene_std::renderer::ClickTargetType; +use graphene_std::vector::click_target::ClickTargetType; use graphene_std::vector::misc::dvec2_to_point; use kurbo::{BezPath, PathEl, Shape}; use std::collections::VecDeque; diff --git a/editor/src/messages/tool/common_functionality/snapping/layer_snapper.rs b/editor/src/messages/tool/common_functionality/snapping/layer_snapper.rs index 5e41f5df81..3a30671357 100644 --- a/editor/src/messages/tool/common_functionality/snapping/layer_snapper.rs +++ b/editor/src/messages/tool/common_functionality/snapping/layer_snapper.rs @@ -5,6 +5,7 @@ use crate::messages::portfolio::document::utility_types::misc::*; use crate::messages::prelude::*; use bezier_rs::{Bezier, Identifier, Subpath, TValue}; use glam::{DAffine2, DVec2}; +use graphene_std::math::math_ext::QuadExt; use graphene_std::renderer::Quad; use graphene_std::vector::PointId; diff --git a/node-graph/README.md b/node-graph/README.md index c93fcc79ad..24ff12c763 100644 --- a/node-graph/README.md +++ b/node-graph/README.md @@ -157,7 +157,7 @@ raster_node!(graphene_core::raster::OpacityNode<_>, params: [f64]), There is also the more general `register_node!` for nodes that do not need to run per pixel. ```rs -register_node!(graphene_core::transform::SetTransformNode<_>, input: VectorData, params: [DAffine2]), +register_node!(graphene_core::transform_nodes::SetTransformNode<_>, input: VectorData, params: [DAffine2]), ``` ## Debugging diff --git a/node-graph/gcore/src/blending.rs b/node-graph/gcore/src/blending.rs new file mode 100644 index 0000000000..18cc4fc604 --- /dev/null +++ b/node-graph/gcore/src/blending.rs @@ -0,0 +1,271 @@ +use dyn_any::DynAny; +use std::hash::Hash; + +#[derive(Copy, Clone, Debug, PartialEq, DynAny, specta::Type, serde::Serialize, serde::Deserialize)] +#[serde(default)] +pub struct AlphaBlending { + pub blend_mode: BlendMode, + pub opacity: f32, + pub fill: f32, + pub clip: bool, +} +impl Default for AlphaBlending { + fn default() -> Self { + Self::new() + } +} +impl Hash for AlphaBlending { + fn hash(&self, state: &mut H) { + self.opacity.to_bits().hash(state); + self.fill.to_bits().hash(state); + self.blend_mode.hash(state); + self.clip.hash(state); + } +} +impl std::fmt::Display for AlphaBlending { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let round = |x: f32| (x * 1e3).round() / 1e3; + write!( + f, + "Blend Mode: {} — Opacity: {}% — Fill: {}% — Clip: {}", + self.blend_mode, + round(self.opacity * 100.), + round(self.fill * 100.), + if self.clip { "Yes" } else { "No" } + ) + } +} + +impl AlphaBlending { + pub const fn new() -> Self { + Self { + opacity: 1., + fill: 1., + blend_mode: BlendMode::Normal, + clip: false, + } + } + + pub fn lerp(&self, other: &Self, t: f32) -> Self { + let lerp = |a: f32, b: f32, t: f32| a + (b - a) * t; + + AlphaBlending { + opacity: lerp(self.opacity, other.opacity, t), + fill: lerp(self.fill, other.fill, t), + blend_mode: if t < 0.5 { self.blend_mode } else { other.blend_mode }, + clip: if t < 0.5 { self.clip } else { other.clip }, + } + } +} + +#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] +#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, DynAny, Hash, specta::Type)] +#[repr(i32)] +pub enum BlendMode { + // Basic group + #[default] + Normal, + + // Darken group + Darken, + Multiply, + ColorBurn, + LinearBurn, + DarkerColor, + + // Lighten group + Lighten, + Screen, + ColorDodge, + LinearDodge, + LighterColor, + + // Contrast group + Overlay, + SoftLight, + HardLight, + VividLight, + LinearLight, + PinLight, + HardMix, + + // Inversion group + Difference, + Exclusion, + Subtract, + Divide, + + // Component group + Hue, + Saturation, + Color, + Luminosity, + + // Other stuff + Erase, + Restore, + MultiplyAlpha, +} + +impl BlendMode { + /// All standard blend modes ordered by group. + pub fn list() -> [&'static [BlendMode]; 6] { + use BlendMode::*; + [ + // Normal group + &[Normal], + // Darken group + &[Darken, Multiply, ColorBurn, LinearBurn, DarkerColor], + // Lighten group + &[Lighten, Screen, ColorDodge, LinearDodge, LighterColor], + // Contrast group + &[Overlay, SoftLight, HardLight, VividLight, LinearLight, PinLight, HardMix], + // Inversion group + &[Difference, Exclusion, Subtract, Divide], + // Component group + &[Hue, Saturation, Color, Luminosity], + ] + } + + /// The subset of [`BlendMode::list()`] that is supported by SVG. + pub fn list_svg_subset() -> [&'static [BlendMode]; 6] { + use BlendMode::*; + [ + // Normal group + &[Normal], + // Darken group + &[Darken, Multiply, ColorBurn], + // Lighten group + &[Lighten, Screen, ColorDodge], + // Contrast group + &[Overlay, SoftLight, HardLight], + // Inversion group + &[Difference, Exclusion], + // Component group + &[Hue, Saturation, Color, Luminosity], + ] + } + + pub fn index_in_list(&self) -> Option { + Self::list().iter().flat_map(|x| x.iter()).position(|&blend_mode| blend_mode == *self) + } + + pub fn index_in_list_svg_subset(&self) -> Option { + Self::list_svg_subset().iter().flat_map(|x| x.iter()).position(|&blend_mode| blend_mode == *self) + } + + /// Convert the enum to the CSS string for the blend mode. + /// [Read more](https://developer.mozilla.org/en-US/docs/Web/CSS/blend-mode#values) + pub fn to_svg_style_name(&self) -> Option<&'static str> { + match self { + // Normal group + BlendMode::Normal => Some("normal"), + // Darken group + BlendMode::Darken => Some("darken"), + BlendMode::Multiply => Some("multiply"), + BlendMode::ColorBurn => Some("color-burn"), + // Lighten group + BlendMode::Lighten => Some("lighten"), + BlendMode::Screen => Some("screen"), + BlendMode::ColorDodge => Some("color-dodge"), + // Contrast group + BlendMode::Overlay => Some("overlay"), + BlendMode::SoftLight => Some("soft-light"), + BlendMode::HardLight => Some("hard-light"), + // Inversion group + BlendMode::Difference => Some("difference"), + BlendMode::Exclusion => Some("exclusion"), + // Component group + BlendMode::Hue => Some("hue"), + BlendMode::Saturation => Some("saturation"), + BlendMode::Color => Some("color"), + BlendMode::Luminosity => Some("luminosity"), + _ => None, + } + } + + /// Renders the blend mode CSS style declaration. + pub fn render(&self) -> String { + format!( + r#" mix-blend-mode: {};"#, + self.to_svg_style_name().unwrap_or_else(|| { + warn!("Unsupported blend mode {self:?}"); + "normal" + }) + ) + } +} + +impl std::fmt::Display for BlendMode { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + // Normal group + BlendMode::Normal => write!(f, "Normal"), + // Darken group + BlendMode::Darken => write!(f, "Darken"), + BlendMode::Multiply => write!(f, "Multiply"), + BlendMode::ColorBurn => write!(f, "Color Burn"), + BlendMode::LinearBurn => write!(f, "Linear Burn"), + BlendMode::DarkerColor => write!(f, "Darker Color"), + // Lighten group + BlendMode::Lighten => write!(f, "Lighten"), + BlendMode::Screen => write!(f, "Screen"), + BlendMode::ColorDodge => write!(f, "Color Dodge"), + BlendMode::LinearDodge => write!(f, "Linear Dodge"), + BlendMode::LighterColor => write!(f, "Lighter Color"), + // Contrast group + BlendMode::Overlay => write!(f, "Overlay"), + BlendMode::SoftLight => write!(f, "Soft Light"), + BlendMode::HardLight => write!(f, "Hard Light"), + BlendMode::VividLight => write!(f, "Vivid Light"), + BlendMode::LinearLight => write!(f, "Linear Light"), + BlendMode::PinLight => write!(f, "Pin Light"), + BlendMode::HardMix => write!(f, "Hard Mix"), + // Inversion group + BlendMode::Difference => write!(f, "Difference"), + BlendMode::Exclusion => write!(f, "Exclusion"), + BlendMode::Subtract => write!(f, "Subtract"), + BlendMode::Divide => write!(f, "Divide"), + // Component group + BlendMode::Hue => write!(f, "Hue"), + BlendMode::Saturation => write!(f, "Saturation"), + BlendMode::Color => write!(f, "Color"), + BlendMode::Luminosity => write!(f, "Luminosity"), + // Other utility blend modes (hidden from the normal list) + BlendMode::Erase => write!(f, "Erase"), + BlendMode::Restore => write!(f, "Restore"), + BlendMode::MultiplyAlpha => write!(f, "Multiply Alpha"), + } + } +} + +#[cfg(feature = "vello")] +impl From for vello::peniko::Mix { + fn from(val: BlendMode) -> Self { + match val { + // Normal group + BlendMode::Normal => vello::peniko::Mix::Normal, + // Darken group + BlendMode::Darken => vello::peniko::Mix::Darken, + BlendMode::Multiply => vello::peniko::Mix::Multiply, + BlendMode::ColorBurn => vello::peniko::Mix::ColorBurn, + // Lighten group + BlendMode::Lighten => vello::peniko::Mix::Lighten, + BlendMode::Screen => vello::peniko::Mix::Screen, + BlendMode::ColorDodge => vello::peniko::Mix::ColorDodge, + // Contrast group + BlendMode::Overlay => vello::peniko::Mix::Overlay, + BlendMode::SoftLight => vello::peniko::Mix::SoftLight, + BlendMode::HardLight => vello::peniko::Mix::HardLight, + // Inversion group + BlendMode::Difference => vello::peniko::Mix::Difference, + BlendMode::Exclusion => vello::peniko::Mix::Exclusion, + // Component group + BlendMode::Hue => vello::peniko::Mix::Hue, + BlendMode::Saturation => vello::peniko::Mix::Saturation, + BlendMode::Color => vello::peniko::Mix::Color, + BlendMode::Luminosity => vello::peniko::Mix::Luminosity, + _ => todo!(), + } + } +} diff --git a/node-graph/gcore/src/blending_nodes.rs b/node-graph/gcore/src/blending_nodes.rs new file mode 100644 index 0000000000..fcf2bd0c00 --- /dev/null +++ b/node-graph/gcore/src/blending_nodes.rs @@ -0,0 +1,175 @@ +use crate::raster::Image; +use crate::raster_types::{CPU, RasterDataTable}; +use crate::registry::types::Percentage; +use crate::vector::VectorDataTable; +use crate::{BlendMode, Color, Ctx, GraphicElement, GraphicGroupTable}; + +pub(super) trait MultiplyAlpha { + fn multiply_alpha(&mut self, factor: f64); +} + +impl MultiplyAlpha for Color { + fn multiply_alpha(&mut self, factor: f64) { + *self = Color::from_rgbaf32_unchecked(self.r(), self.g(), self.b(), (self.a() * factor as f32).clamp(0., 1.)) + } +} +impl MultiplyAlpha for VectorDataTable { + fn multiply_alpha(&mut self, factor: f64) { + for instance in self.instance_mut_iter() { + instance.alpha_blending.opacity *= factor as f32; + } + } +} +impl MultiplyAlpha for GraphicGroupTable { + fn multiply_alpha(&mut self, factor: f64) { + for instance in self.instance_mut_iter() { + instance.alpha_blending.opacity *= factor as f32; + } + } +} +impl MultiplyAlpha for RasterDataTable +where + GraphicElement: From>, +{ + fn multiply_alpha(&mut self, factor: f64) { + for instance in self.instance_mut_iter() { + instance.alpha_blending.opacity *= factor as f32; + } + } +} + +pub(super) trait MultiplyFill { + fn multiply_fill(&mut self, factor: f64); +} +impl MultiplyFill for Color { + fn multiply_fill(&mut self, factor: f64) { + *self = Color::from_rgbaf32_unchecked(self.r(), self.g(), self.b(), (self.a() * factor as f32).clamp(0., 1.)) + } +} +impl MultiplyFill for VectorDataTable { + fn multiply_fill(&mut self, factor: f64) { + for instance in self.instance_mut_iter() { + instance.alpha_blending.fill *= factor as f32; + } + } +} +impl MultiplyFill for GraphicGroupTable { + fn multiply_fill(&mut self, factor: f64) { + for instance in self.instance_mut_iter() { + instance.alpha_blending.fill *= factor as f32; + } + } +} +impl MultiplyFill for RasterDataTable { + fn multiply_fill(&mut self, factor: f64) { + for instance in self.instance_mut_iter() { + instance.alpha_blending.fill *= factor as f32; + } + } +} + +trait SetBlendMode { + fn set_blend_mode(&mut self, blend_mode: BlendMode); +} + +impl SetBlendMode for VectorDataTable { + fn set_blend_mode(&mut self, blend_mode: BlendMode) { + for instance in self.instance_mut_iter() { + instance.alpha_blending.blend_mode = blend_mode; + } + } +} +impl SetBlendMode for GraphicGroupTable { + fn set_blend_mode(&mut self, blend_mode: BlendMode) { + for instance in self.instance_mut_iter() { + instance.alpha_blending.blend_mode = blend_mode; + } + } +} +impl SetBlendMode for RasterDataTable { + fn set_blend_mode(&mut self, blend_mode: BlendMode) { + for instance in self.instance_mut_iter() { + instance.alpha_blending.blend_mode = blend_mode; + } + } +} + +trait SetClip { + fn set_clip(&mut self, clip: bool); +} + +impl SetClip for VectorDataTable { + fn set_clip(&mut self, clip: bool) { + for instance in self.instance_mut_iter() { + instance.alpha_blending.clip = clip; + } + } +} +impl SetClip for GraphicGroupTable { + fn set_clip(&mut self, clip: bool) { + for instance in self.instance_mut_iter() { + instance.alpha_blending.clip = clip; + } + } +} +impl SetClip for RasterDataTable { + fn set_clip(&mut self, clip: bool) { + for instance in self.instance_mut_iter() { + instance.alpha_blending.clip = clip; + } + } +} + +#[node_macro::node(category("Style"))] +fn blend_mode( + _: impl Ctx, + #[implementations( + GraphicGroupTable, + VectorDataTable, + RasterDataTable, + )] + mut value: T, + blend_mode: BlendMode, +) -> T { + // TODO: Find a way to make this apply once to the table's parent (i.e. its row in its parent table or Instance) rather than applying to each row in its own table, which produces the undesired result + value.set_blend_mode(blend_mode); + value +} + +#[node_macro::node(category("Style"))] +fn opacity( + _: impl Ctx, + #[implementations( + GraphicGroupTable, + VectorDataTable, + RasterDataTable, + )] + mut value: T, + #[default(100.)] opacity: Percentage, +) -> T { + // TODO: Find a way to make this apply once to the table's parent (i.e. its row in its parent table or Instance) rather than applying to each row in its own table, which produces the undesired result + value.multiply_alpha(opacity / 100.); + value +} + +#[node_macro::node(category("Style"))] +fn blending( + _: impl Ctx, + #[implementations( + GraphicGroupTable, + VectorDataTable, + RasterDataTable, + )] + mut value: T, + blend_mode: BlendMode, + #[default(100.)] opacity: Percentage, + #[default(100.)] fill: Percentage, + #[default(false)] clip: bool, +) -> T { + // TODO: Find a way to make this apply once to the table's parent (i.e. its row in its parent table or Instance) rather than applying to each row in its own table, which produces the undesired result + value.set_blend_mode(blend_mode); + value.multiply_alpha(opacity / 100.); + value.multiply_fill(fill / 100.); + value.set_clip(clip); + value +} diff --git a/node-graph/gcore/src/raster/color.rs b/node-graph/gcore/src/color/color.rs similarity index 97% rename from node-graph/gcore/src/raster/color.rs rename to node-graph/gcore/src/color/color.rs index e1e0cd2f8f..69edc39e87 100644 --- a/node-graph/gcore/src/raster/color.rs +++ b/node-graph/gcore/src/color/color.rs @@ -1,5 +1,5 @@ +use super::color_traits::{Alpha, AlphaMut, AssociatedAlpha, Luminance, LuminanceMut, Pixel, RGB, RGBMut, Rec709Primaries, SRGB}; use super::discrete_srgb::{float_to_srgb_u8, srgb_u8_to_float}; -use super::{Alpha, AlphaMut, AssociatedAlpha, Luminance, LuminanceMut, Pixel, RGB, RGBMut, Rec709Primaries, SRGB}; use bytemuck::{Pod, Zeroable}; use dyn_any::DynAny; use half::f16; @@ -345,7 +345,7 @@ impl Color { /// /// # Examples /// ``` - /// use graphene_core::raster::color::Color; + /// use graphene_core::color::Color; /// let color = Color::from_rgbaf32(0.3, 0.14, 0.15, 0.92).unwrap(); /// assert!(color.components() == (0.3, 0.14, 0.15, 0.92)); /// @@ -383,7 +383,7 @@ impl Color { /// /// # Examples /// ``` - /// use graphene_core::raster::color::Color; + /// use graphene_core::color::Color; /// let color = Color::from_rgb8_srgb(0x72, 0x67, 0x62); /// let color2 = Color::from_rgba8_srgb(0x72, 0x67, 0x62, 0xFF); /// assert_eq!(color, color2) @@ -398,7 +398,7 @@ impl Color { /// /// # Examples /// ``` - /// use graphene_core::raster::color::Color; + /// use graphene_core::color::Color; /// let color = Color::from_rgba8_srgb(0x72, 0x67, 0x62, 0x61); /// ``` #[inline(always)] @@ -416,7 +416,7 @@ impl Color { /// /// # Examples /// ``` - /// use graphene_core::raster::color::Color; + /// use graphene_core::color::Color; /// let color = Color::from_hsla(0.5, 0.2, 0.3, 1.); /// ``` pub fn from_hsla(hue: f32, saturation: f32, lightness: f32, alpha: f32) -> Color { @@ -458,7 +458,7 @@ impl Color { /// /// # Examples /// ``` - /// use graphene_core::raster::color::Color; + /// use graphene_core::color::Color; /// let color = Color::from_rgbaf32(0.114, 0.103, 0.98, 0.97).unwrap(); /// assert!(color.r() == 0.114); /// ``` @@ -471,7 +471,7 @@ impl Color { /// /// # Examples /// ``` - /// use graphene_core::raster::color::Color; + /// use graphene_core::color::Color; /// let color = Color::from_rgbaf32(0.114, 0.103, 0.98, 0.97).unwrap(); /// assert!(color.g() == 0.103); /// ``` @@ -484,7 +484,7 @@ impl Color { /// /// # Examples /// ``` - /// use graphene_core::raster::color::Color; + /// use graphene_core::color::Color; /// let color = Color::from_rgbaf32(0.114, 0.103, 0.98, 0.97).unwrap(); /// assert!(color.b() == 0.98); /// ``` @@ -497,7 +497,7 @@ impl Color { /// /// # Examples /// ``` - /// use graphene_core::raster::color::Color; + /// use graphene_core::color::Color; /// let color = Color::from_rgbaf32(0.114, 0.103, 0.98, 0.97).unwrap(); /// assert!(color.a() == 0.97); /// ``` @@ -773,7 +773,7 @@ impl Color { /// /// # Examples /// ``` - /// use graphene_core::raster::color::Color; + /// use graphene_core::color::Color; /// let color = Color::from_rgbaf32(0.114, 0.103, 0.98, 0.97).unwrap(); /// assert_eq!(color.components(), (0.114, 0.103, 0.98, 0.97)); /// ``` @@ -786,7 +786,7 @@ impl Color { /// /// # Examples /// ``` - /// use graphene_core::raster::color::Color; + /// use graphene_core::color::Color; /// let color = Color::from_rgba8_srgb(0x52, 0x67, 0xFA, 0x61); // Premultiplied alpha /// assert_eq!("3240a261", color.to_rgba_hex_srgb()); // Equivalent hex incorporating premultiplied alpha /// ``` @@ -803,7 +803,7 @@ impl Color { /// Return a 6-character RGB hex string (without a # prefix). Use this if the [`Color`] is in linear space. /// ``` - /// use graphene_core::raster::color::Color; + /// use graphene_core::color::Color; /// let color = Color::from_rgba8_srgb(0x52, 0x67, 0xFA, 0x61); // Premultiplied alpha /// assert_eq!("3240a2", color.to_rgb_hex_srgb()); // Equivalent hex incorporating premultiplied alpha /// ``` @@ -813,7 +813,7 @@ impl Color { /// Return a 6-character RGB hex string (without a # prefix). Use this if the [`Color`] is in gamma space. /// ``` - /// use graphene_core::raster::color::Color; + /// use graphene_core::color::Color; /// let color = Color::from_rgba8_srgb(0x52, 0x67, 0xFA, 0x61); // Premultiplied alpha /// assert_eq!("3240a2", color.to_rgb_hex_srgb()); // Equivalent hex incorporating premultiplied alpha /// ``` @@ -825,7 +825,7 @@ impl Color { /// /// # Examples /// ``` - /// use graphene_core::raster::color::Color; + /// use graphene_core::color::Color; /// let color = Color::from_rgbaf32(0.114, 0.103, 0.98, 0.97).unwrap(); /// // TODO: Add test /// ``` @@ -840,7 +840,7 @@ impl Color { /// /// # Examples /// ``` - /// use graphene_core::raster::color::Color; + /// use graphene_core::color::Color; /// let color = Color::from_hsla(0.5, 0.2, 0.3, 1.).to_hsla(); /// ``` pub fn to_hsla(&self) -> [f32; 4] { @@ -876,7 +876,7 @@ impl Color { /// /// # Examples /// ``` - /// use graphene_core::raster::color::Color; + /// use graphene_core::color::Color; /// let color = Color::from_rgba_str("7C67FA61").unwrap(); /// ``` pub fn from_rgba_str(color_str: &str) -> Option { @@ -894,7 +894,7 @@ impl Color { /// Creates a color from a 6-character RGB hex string (without a # prefix). /// /// ``` - /// use graphene_core::raster::color::Color; + /// use graphene_core::color::Color; /// let color = Color::from_rgb_str("7C67FA").unwrap(); /// ``` pub fn from_rgb_str(color_str: &str) -> Option { diff --git a/node-graph/gcore/src/color/color_traits.rs b/node-graph/gcore/src/color/color_traits.rs new file mode 100644 index 0000000000..b8ffa41f34 --- /dev/null +++ b/node-graph/gcore/src/color/color_traits.rs @@ -0,0 +1,205 @@ +use bytemuck::{Pod, Zeroable}; +use glam::DVec2; +use std::fmt::Debug; + +#[cfg(target_arch = "spirv")] +use spirv_std::num_traits::float::Float; + +pub use crate::blending::*; + +pub trait Linear { + fn from_f32(x: f32) -> Self; + fn to_f32(self) -> f32; + fn from_f64(x: f64) -> Self; + fn to_f64(self) -> f64; + fn lerp(self, other: Self, value: Self) -> Self + where + Self: Sized + Copy, + Self: std::ops::Sub, + Self: std::ops::Mul, + Self: std::ops::Add, + { + self + (other - self) * value + } +} + +#[rustfmt::skip] +impl Linear for f32 { + #[inline(always)] fn from_f32(x: f32) -> Self { x } + #[inline(always)] fn to_f32(self) -> f32 { self } + #[inline(always)] fn from_f64(x: f64) -> Self { x as f32 } + #[inline(always)] fn to_f64(self) -> f64 { self as f64 } +} + +#[rustfmt::skip] +impl Linear for f64 { + #[inline(always)] fn from_f32(x: f32) -> Self { x as f64 } + #[inline(always)] fn to_f32(self) -> f32 { self as f32 } + #[inline(always)] fn from_f64(x: f64) -> Self { x } + #[inline(always)] fn to_f64(self) -> f64 { self } +} + +pub trait Channel: Copy + Debug { + fn to_linear(self) -> Out; + fn from_linear(linear: In) -> Self; +} + +pub trait LinearChannel: Channel { + fn cast_linear_channel(self) -> Out { + Out::from_linear(self.to_linear::()) + } +} + +impl Channel for T { + #[inline(always)] + fn to_linear(self) -> Out { + Out::from_f64(self.to_f64()) + } + + #[inline(always)] + fn from_linear(linear: In) -> Self { + Self::from_f64(linear.to_f64()) + } +} + +impl LinearChannel for T {} + +use num_derive::*; +#[derive(Copy, Clone, Debug, PartialEq, PartialOrd, Num, NumCast, NumOps, One, Zero, ToPrimitive, FromPrimitive)] +pub struct SRGBGammaFloat(f32); + +impl Channel for SRGBGammaFloat { + #[inline(always)] + fn to_linear(self) -> Out { + let x = self.0; + Out::from_f32(if x <= 0.04045 { x / 12.92 } else { ((x + 0.055) / 1.055).powf(2.4) }) + } + + #[inline(always)] + fn from_linear(linear: In) -> Self { + let x = linear.to_f32(); + if x <= 0.0031308 { Self(x * 12.92) } else { Self(1.055 * x.powf(1. / 2.4) - 0.055) } + } +} +pub trait RGBPrimaries { + const RED: DVec2; + const GREEN: DVec2; + const BLUE: DVec2; + const WHITE: DVec2; +} +pub trait Rec709Primaries {} +impl RGBPrimaries for T { + const RED: DVec2 = DVec2::new(0.64, 0.33); + const GREEN: DVec2 = DVec2::new(0.3, 0.6); + const BLUE: DVec2 = DVec2::new(0.15, 0.06); + const WHITE: DVec2 = DVec2::new(0.3127, 0.329); +} + +pub trait SRGB: Rec709Primaries {} + +pub trait Serde: serde::Serialize + for<'a> serde::Deserialize<'a> {} +#[cfg(not(feature = "serde"))] +pub trait Serde {} + +impl serde::Deserialize<'a>> Serde for T {} +#[cfg(not(feature = "serde"))] +impl Serde for T {} + +// TODO: Come up with a better name for this trait +pub trait Pixel: Clone + Pod + Zeroable + Default { + #[cfg(not(target_arch = "spirv"))] + fn to_bytes(&self) -> Vec { + bytemuck::bytes_of(self).to_vec() + } + // TODO: use u8 for Color + fn from_bytes(bytes: &[u8]) -> Self { + *bytemuck::try_from_bytes(bytes).expect("Failed to convert bytes to pixel") + } + + fn byte_size() -> usize { + size_of::() + } +} +pub trait RGB: Pixel { + type ColorChannel: Channel; + + fn red(&self) -> Self::ColorChannel; + fn r(&self) -> Self::ColorChannel { + self.red() + } + fn green(&self) -> Self::ColorChannel; + fn g(&self) -> Self::ColorChannel { + self.green() + } + fn blue(&self) -> Self::ColorChannel; + fn b(&self) -> Self::ColorChannel { + self.blue() + } +} +pub trait RGBMut: RGB { + fn set_red(&mut self, red: Self::ColorChannel); + fn set_green(&mut self, green: Self::ColorChannel); + fn set_blue(&mut self, blue: Self::ColorChannel); +} + +pub trait AssociatedAlpha: RGB + Alpha { + fn to_unassociated(&self) -> Out; +} + +pub trait UnassociatedAlpha: RGB + Alpha { + fn to_associated(&self) -> Out; +} + +pub trait Alpha { + type AlphaChannel: LinearChannel; + const TRANSPARENT: Self; + fn alpha(&self) -> Self::AlphaChannel; + fn a(&self) -> Self::AlphaChannel { + self.alpha() + } + fn multiplied_alpha(&self, alpha: Self::AlphaChannel) -> Self; +} +pub trait AlphaMut: Alpha { + fn set_alpha(&mut self, value: Self::AlphaChannel); +} + +pub trait Depth { + type DepthChannel: Channel; + fn depth(&self) -> Self::DepthChannel; + fn d(&self) -> Self::DepthChannel { + self.depth() + } +} + +pub trait ExtraChannels { + type ChannelType: Channel; + fn extra_channels(&self) -> [Self::ChannelType; NUM]; +} + +pub trait Luminance { + type LuminanceChannel: LinearChannel; + fn luminance(&self) -> Self::LuminanceChannel; + fn l(&self) -> Self::LuminanceChannel { + self.luminance() + } +} + +pub trait LuminanceMut: Luminance { + fn set_luminance(&mut self, luminance: Self::LuminanceChannel); +} + +// TODO: We might rename this to Raster at some point +pub trait Sample { + type Pixel: Pixel; + // TODO: Add an area parameter + fn sample(&self, pos: DVec2, area: DVec2) -> Option; +} + +impl Sample for &T { + type Pixel = T::Pixel; + + #[inline(always)] + fn sample(&self, pos: DVec2, area: DVec2) -> Option { + (**self).sample(pos, area) + } +} diff --git a/node-graph/gcore/src/raster/discrete_srgb.rs b/node-graph/gcore/src/color/discrete_srgb.rs similarity index 100% rename from node-graph/gcore/src/raster/discrete_srgb.rs rename to node-graph/gcore/src/color/discrete_srgb.rs diff --git a/node-graph/gcore/src/color/mod.rs b/node-graph/gcore/src/color/mod.rs new file mode 100644 index 0000000000..3b286c510c --- /dev/null +++ b/node-graph/gcore/src/color/mod.rs @@ -0,0 +1,7 @@ +mod color; +mod color_traits; +mod discrete_srgb; + +pub use color::*; +pub use color_traits::*; +pub use discrete_srgb::*; diff --git a/node-graph/gcore/src/gradient.rs b/node-graph/gcore/src/gradient.rs new file mode 100644 index 0000000000..8034cc9876 --- /dev/null +++ b/node-graph/gcore/src/gradient.rs @@ -0,0 +1,248 @@ +use crate::Color; +use dyn_any::DynAny; +use glam::{DAffine2, DVec2}; + +#[derive(Default, PartialEq, Eq, Clone, Copy, Debug, Hash, serde::Serialize, serde::Deserialize, DynAny, specta::Type, node_macro::ChoiceType)] +#[widget(Radio)] +pub enum GradientType { + #[default] + Linear, + Radial, +} + +// TODO: Someday we could switch this to a Box[T] to avoid over-allocation +// TODO: Use linear not gamma colors +/// A list of colors associated with positions (in the range 0 to 1) along a gradient. +#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize, DynAny, specta::Type)] +pub struct GradientStops(pub Vec<(f64, Color)>); + +impl std::hash::Hash for GradientStops { + fn hash(&self, state: &mut H) { + self.0.len().hash(state); + self.0.iter().for_each(|(position, color)| { + position.to_bits().hash(state); + color.hash(state); + }); + } +} + +impl Default for GradientStops { + fn default() -> Self { + Self(vec![(0., Color::BLACK), (1., Color::WHITE)]) + } +} + +impl IntoIterator for GradientStops { + type Item = (f64, Color); + type IntoIter = std::vec::IntoIter<(f64, Color)>; + + fn into_iter(self) -> Self::IntoIter { + self.0.into_iter() + } +} + +impl<'a> IntoIterator for &'a GradientStops { + type Item = &'a (f64, Color); + type IntoIter = std::slice::Iter<'a, (f64, Color)>; + + fn into_iter(self) -> Self::IntoIter { + self.0.iter() + } +} + +impl std::ops::Index for GradientStops { + type Output = (f64, Color); + + fn index(&self, index: usize) -> &Self::Output { + &self.0[index] + } +} + +impl std::ops::Deref for GradientStops { + type Target = Vec<(f64, Color)>; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl std::ops::DerefMut for GradientStops { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.0 + } +} + +impl GradientStops { + pub fn new(stops: Vec<(f64, Color)>) -> Self { + let mut stops = Self(stops); + stops.sort(); + stops + } + + pub fn evaluate(&self, t: f64) -> Color { + if self.0.is_empty() { + return Color::BLACK; + } + + if t <= self.0[0].0 { + return self.0[0].1; + } + if t >= self.0[self.0.len() - 1].0 { + return self.0[self.0.len() - 1].1; + } + + for i in 0..self.0.len() - 1 { + let (t1, c1) = self.0[i]; + let (t2, c2) = self.0[i + 1]; + if t >= t1 && t <= t2 { + let normalized_t = (t - t1) / (t2 - t1); + return c1.lerp(&c2, normalized_t as f32); + } + } + + Color::BLACK + } + + pub fn sort(&mut self) { + self.0.sort_unstable_by(|a, b| a.0.partial_cmp(&b.0).unwrap()); + } + + pub fn reversed(&self) -> Self { + Self(self.0.iter().rev().map(|(position, color)| (1. - position, *color)).collect()) + } + + pub fn map_colors Color>(&self, f: F) -> Self { + Self(self.0.iter().map(|(position, color)| (*position, f(color))).collect()) + } +} + +/// A gradient fill. +/// +/// Contains the start and end points, along with the colors at varying points along the length. +#[repr(C)] +#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize, DynAny, specta::Type)] +pub struct Gradient { + pub stops: GradientStops, + pub gradient_type: GradientType, + pub start: DVec2, + pub end: DVec2, + pub transform: DAffine2, +} + +impl Default for Gradient { + fn default() -> Self { + Self { + stops: GradientStops::default(), + gradient_type: GradientType::Linear, + start: DVec2::new(0., 0.5), + end: DVec2::new(1., 0.5), + transform: DAffine2::IDENTITY, + } + } +} + +impl std::hash::Hash for Gradient { + fn hash(&self, state: &mut H) { + self.stops.0.len().hash(state); + [].iter() + .chain(self.start.to_array().iter()) + .chain(self.end.to_array().iter()) + .chain(self.transform.to_cols_array().iter()) + .chain(self.stops.0.iter().map(|(position, _)| position)) + .for_each(|x| x.to_bits().hash(state)); + self.stops.0.iter().for_each(|(_, color)| color.hash(state)); + self.gradient_type.hash(state); + } +} + +impl std::fmt::Display for Gradient { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let round = |x: f64| (x * 1e3).round() / 1e3; + let stops = self + .stops + .0 + .iter() + .map(|(position, color)| format!("[{}%: #{}]", round(position * 100.), color.to_rgba_hex_srgb())) + .collect::>() + .join(", "); + write!(f, "{} Gradient: {stops}", self.gradient_type) + } +} + +impl Gradient { + /// Constructs a new gradient with the colors at 0 and 1 specified. + pub fn new(start: DVec2, start_color: Color, end: DVec2, end_color: Color, transform: DAffine2, gradient_type: GradientType) -> Self { + Gradient { + start, + end, + stops: GradientStops::new(vec![(0., start_color.to_gamma_srgb()), (1., end_color.to_gamma_srgb())]), + transform, + gradient_type, + } + } + + pub fn lerp(&self, other: &Self, time: f64) -> Self { + let start = self.start + (other.start - self.start) * time; + let end = self.end + (other.end - self.end) * time; + let transform = self.transform; + let stops = self + .stops + .0 + .iter() + .zip(other.stops.0.iter()) + .map(|((a_pos, a_color), (b_pos, b_color))| { + let position = a_pos + (b_pos - a_pos) * time; + let color = a_color.lerp(b_color, time as f32); + (position, color) + }) + .collect::>(); + let stops = GradientStops::new(stops); + let gradient_type = if time < 0.5 { self.gradient_type } else { other.gradient_type }; + + Self { + start, + end, + transform, + stops, + gradient_type, + } + } + + /// Insert a stop into the gradient, the index if successful + pub fn insert_stop(&mut self, mouse: DVec2, transform: DAffine2) -> Option { + // Transform the start and end positions to the same coordinate space as the mouse. + let (start, end) = (transform.transform_point2(self.start), transform.transform_point2(self.end)); + + // Calculate the new position by finding the closest point on the line + let new_position = ((end - start).angle_to(mouse - start)).cos() * start.distance(mouse) / start.distance(end); + + // Don't insert point past end of line + if !(0. ..=1.).contains(&new_position) { + return None; + } + + // Compute the color of the inserted stop + let get_color = |index: usize, time: f64| match (self.stops.0[index].1, self.stops.0.get(index + 1).map(|(_, c)| *c)) { + // Lerp between the nearest colors if applicable + (a, Some(b)) => a.lerp( + &b, + ((time - self.stops.0[index].0) / self.stops.0.get(index + 1).map(|end| end.0 - self.stops.0[index].0).unwrap_or_default()) as f32, + ), + // Use the start or the end color if applicable + (v, _) => v, + }; + + // Compute the correct index to keep the positions in order + let mut index = 0; + while self.stops.0.len() > index && self.stops.0[index].0 <= new_position { + index += 1; + } + + let new_color = get_color(index - 1, new_position); + + // Insert the new stop + self.stops.0.insert(index, (new_position, new_color)); + + Some(index) + } +} diff --git a/node-graph/gcore/src/graphic_element.rs b/node-graph/gcore/src/graphic_element.rs index 3ca4f43e01..744172b26b 100644 --- a/node-graph/gcore/src/graphic_element.rs +++ b/node-graph/gcore/src/graphic_element.rs @@ -1,5 +1,5 @@ +use crate::blending::AlphaBlending; use crate::instances::{Instance, Instances}; -use crate::raster::BlendMode; use crate::raster::image::Image; use crate::raster_types::{CPU, GPU, Raster, RasterDataTable}; use crate::transform::TransformMut; @@ -12,63 +12,6 @@ use std::hash::Hash; pub mod renderer; -#[derive(Copy, Clone, Debug, PartialEq, DynAny, specta::Type, serde::Serialize, serde::Deserialize)] -#[serde(default)] -pub struct AlphaBlending { - pub blend_mode: BlendMode, - pub opacity: f32, - pub fill: f32, - pub clip: bool, -} -impl Default for AlphaBlending { - fn default() -> Self { - Self::new() - } -} -impl Hash for AlphaBlending { - fn hash(&self, state: &mut H) { - self.opacity.to_bits().hash(state); - self.fill.to_bits().hash(state); - self.blend_mode.hash(state); - self.clip.hash(state); - } -} -impl std::fmt::Display for AlphaBlending { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let round = |x: f32| (x * 1e3).round() / 1e3; - write!( - f, - "Blend Mode: {} — Opacity: {}% — Fill: {}% — Clip: {}", - self.blend_mode, - round(self.opacity * 100.), - round(self.fill * 100.), - if self.clip { "Yes" } else { "No" } - ) - } -} - -impl AlphaBlending { - pub const fn new() -> Self { - Self { - opacity: 1., - fill: 1., - blend_mode: BlendMode::Normal, - clip: false, - } - } - - pub fn lerp(&self, other: &Self, t: f32) -> Self { - let lerp = |a: f32, b: f32, t: f32| a + (b - a) * t; - - AlphaBlending { - opacity: lerp(self.opacity, other.opacity, t), - fill: lerp(self.fill, other.fill, t), - blend_mode: if t < 0.5 { self.blend_mode } else { other.blend_mode }, - clip: if t < 0.5 { self.clip } else { other.clip }, - } - } -} - // TODO: Eventually remove this migration document upgrade code pub fn migrate_graphic_group<'de, D: serde::Deserializer<'de>>(deserializer: D) -> Result { use serde::Deserialize; diff --git a/node-graph/gcore/src/graphic_element/renderer.rs b/node-graph/gcore/src/graphic_element/renderer.rs index f05ef86bb5..c8e12a4f6c 100644 --- a/node-graph/gcore/src/graphic_element/renderer.rs +++ b/node-graph/gcore/src/graphic_element/renderer.rs @@ -1,55 +1,23 @@ -mod quad; -mod rect; - use crate::instances::Instance; +pub use crate::math::quad::Quad; +pub use crate::math::rect::Rect; use crate::raster::{BlendMode, Image}; use crate::raster_types::{CPU, GPU, RasterDataTable}; use crate::transform::{Footprint, Transform}; use crate::uuid::{NodeId, generate_uuid}; +use crate::vector::VectorDataTable; +use crate::vector::click_target::{ClickTarget, FreePoint}; use crate::vector::style::{Fill, Stroke, StrokeAlign, ViewMode}; -use crate::vector::{PointId, VectorDataTable}; use crate::{Artboard, ArtboardGroupTable, Color, GraphicElement, GraphicGroupTable}; use bezier_rs::Subpath; use dyn_any::DynAny; -use glam::{DAffine2, DMat2, DVec2}; +use glam::{DAffine2, DVec2}; use num_traits::Zero; -pub use quad::Quad; -pub use rect::Rect; use std::collections::{HashMap, HashSet}; use std::fmt::Write; #[cfg(feature = "vello")] use vello::*; -#[derive(Copy, Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)] -pub struct FreePoint { - pub id: PointId, - pub position: DVec2, -} - -impl FreePoint { - pub fn new(id: PointId, position: DVec2) -> Self { - Self { id, position } - } - - pub fn apply_transform(&mut self, transform: DAffine2) { - self.position = transform.transform_point2(self.position); - } -} - -#[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)] -pub enum ClickTargetType { - Subpath(Subpath), - FreePoint(FreePoint), -} - -/// Represents a clickable target for the layer -#[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)] -pub struct ClickTarget { - target_type: ClickTargetType, - stroke_width: f64, - bounding_box: Option<[DVec2; 2]>, -} - #[derive(Clone, Copy, Debug, PartialEq, serde::Serialize, serde::Deserialize)] enum MaskType { Clip, @@ -73,133 +41,6 @@ impl MaskType { } } -impl ClickTarget { - pub fn new_with_subpath(subpath: Subpath, stroke_width: f64) -> Self { - let bounding_box = subpath.loose_bounding_box(); - Self { - target_type: ClickTargetType::Subpath(subpath), - stroke_width, - bounding_box, - } - } - - pub fn new_with_free_point(point: FreePoint) -> Self { - const MAX_LENGTH_FOR_NO_WIDTH_OR_HEIGHT: f64 = 1e-4 / 2.; - let stroke_width = 10.; - let bounding_box = Some([ - point.position - DVec2::splat(MAX_LENGTH_FOR_NO_WIDTH_OR_HEIGHT), - point.position + DVec2::splat(MAX_LENGTH_FOR_NO_WIDTH_OR_HEIGHT), - ]); - - Self { - target_type: ClickTargetType::FreePoint(point), - stroke_width, - bounding_box, - } - } - - pub fn target_type(&self) -> &ClickTargetType { - &self.target_type - } - - pub fn bounding_box(&self) -> Option<[DVec2; 2]> { - self.bounding_box - } - - pub fn bounding_box_with_transform(&self, transform: DAffine2) -> Option<[DVec2; 2]> { - self.bounding_box.map(|[a, b]| [transform.transform_point2(a), transform.transform_point2(b)]) - } - - pub fn apply_transform(&mut self, affine_transform: DAffine2) { - match self.target_type { - ClickTargetType::Subpath(ref mut subpath) => { - subpath.apply_transform(affine_transform); - } - ClickTargetType::FreePoint(ref mut point) => { - point.apply_transform(affine_transform); - } - } - self.update_bbox(); - } - - fn update_bbox(&mut self) { - match self.target_type { - ClickTargetType::Subpath(ref subpath) => { - self.bounding_box = subpath.bounding_box(); - } - ClickTargetType::FreePoint(ref point) => { - self.bounding_box = Some([point.position - DVec2::splat(self.stroke_width / 2.), point.position + DVec2::splat(self.stroke_width / 2.)]); - } - } - } - - /// Does the click target intersect the path - pub fn intersect_path>(&self, mut bezier_iter: impl FnMut() -> It, layer_transform: DAffine2) -> bool { - // Check if the matrix is not invertible - let mut layer_transform = layer_transform; - if layer_transform.matrix2.determinant().abs() <= f64::EPSILON { - layer_transform.matrix2 += DMat2::IDENTITY * 1e-4; // TODO: Is this the cleanest way to handle this? - } - - let inverse = layer_transform.inverse(); - let mut bezier_iter = || bezier_iter().map(|bezier| bezier.apply_transformation(|point| inverse.transform_point2(point))); - - match self.target_type() { - ClickTargetType::Subpath(subpath) => { - // Check if outlines intersect - let outline_intersects = |path_segment: bezier_rs::Bezier| bezier_iter().any(|line| !path_segment.intersections(&line, None, None).is_empty()); - if subpath.iter().any(outline_intersects) { - return true; - } - // Check if selection is entirely within the shape - if subpath.closed() && bezier_iter().next().is_some_and(|bezier| subpath.contains_point(bezier.start)) { - return true; - } - - // Check if shape is entirely within selection - let any_point_from_subpath = subpath.manipulator_groups().first().map(|group| group.anchor); - any_point_from_subpath.is_some_and(|shape_point| bezier_iter().map(|bezier| bezier.winding(shape_point)).sum::() != 0) - } - ClickTargetType::FreePoint(point) => bezier_iter().map(|bezier: bezier_rs::Bezier| bezier.winding(point.position)).sum::() != 0, - } - } - - /// Does the click target intersect the point (accounting for stroke size) - pub fn intersect_point(&self, point: DVec2, layer_transform: DAffine2) -> bool { - let target_bounds = [point - DVec2::splat(self.stroke_width / 2.), point + DVec2::splat(self.stroke_width / 2.)]; - let intersects = |a: [DVec2; 2], b: [DVec2; 2]| a[0].x <= b[1].x && a[1].x >= b[0].x && a[0].y <= b[1].y && a[1].y >= b[0].y; - // This bounding box is not very accurate as it is the axis aligned version of the transformed bounding box. However it is fast. - if !self - .bounding_box - .is_some_and(|loose| (loose[0] - loose[1]).abs().cmpgt(DVec2::splat(1e-4)).any() && intersects((layer_transform * Quad::from_box(loose)).bounding_box(), target_bounds)) - { - return false; - } - - // Allows for selecting lines - // TODO: actual intersection of stroke - let inflated_quad = Quad::from_box(target_bounds); - self.intersect_path(|| inflated_quad.bezier_lines(), layer_transform) - } - - /// Does the click target intersect the point (not accounting for stroke size) - pub fn intersect_point_no_stroke(&self, point: DVec2) -> bool { - // Check if the point is within the bounding box - if self - .bounding_box - .is_some_and(|bbox| bbox[0].x <= point.x && point.x <= bbox[1].x && bbox[0].y <= point.y && point.y <= bbox[1].y) - { - // Check if the point is within the shape - match self.target_type() { - ClickTargetType::Subpath(subpath) => subpath.closed() && subpath.contains_point(point), - ClickTargetType::FreePoint(free_point) => free_point.position == point, - } - } else { - false - } - } -} - /// Mutable state used whilst rendering to an SVG pub struct SvgRender { pub svg: Vec, diff --git a/node-graph/gcore/src/lib.rs b/node-graph/gcore/src/lib.rs index 68cf13e46b..1a66b38f20 100644 --- a/node-graph/gcore/src/lib.rs +++ b/node-graph/gcore/src/lib.rs @@ -1,38 +1,40 @@ #[macro_use] extern crate log; -pub use crate as graphene_core; -pub use ctor; -pub use num_traits; - pub mod animation; +pub mod blending; +pub mod blending_nodes; +pub mod color; pub mod consts; pub mod context; pub mod generic; +pub mod gradient; +mod graphic_element; pub mod instances; pub mod logic; +pub mod math; +pub mod memo; pub mod misc; pub mod ops; +pub mod raster; pub mod raster_types; +pub mod registry; pub mod structural; pub mod text; +pub mod transform; +pub mod transform_nodes; pub mod uuid; pub mod value; - -pub mod memo; - -pub mod raster; -pub mod transform; - -mod graphic_element; -pub use graphic_element::*; pub mod vector; -pub mod registry; - +pub use crate as graphene_core; +pub use blending::*; pub use context::*; +pub use ctor; pub use dyn_any::{StaticTypeSized, WasmNotSend, WasmNotSync}; +pub use graphic_element::*; pub use memo::MemoHash; +pub use num_traits; pub use raster::Color; use std::any::TypeId; use std::future::Future; @@ -159,3 +161,12 @@ pub trait NodeInputDecleration { fn identifier() -> &'static str; type Result; } + +pub trait AsU32 { + fn as_u32(&self) -> u32; +} +impl AsU32 for u32 { + fn as_u32(&self) -> u32 { + *self + } +} diff --git a/node-graph/gcore/src/raster/bbox.rs b/node-graph/gcore/src/math/bbox.rs similarity index 100% rename from node-graph/gcore/src/raster/bbox.rs rename to node-graph/gcore/src/math/bbox.rs diff --git a/node-graph/gcore/src/math/math_ext.rs b/node-graph/gcore/src/math/math_ext.rs new file mode 100644 index 0000000000..bab9c19bf9 --- /dev/null +++ b/node-graph/gcore/src/math/math_ext.rs @@ -0,0 +1,25 @@ +use crate::math::quad::Quad; +use crate::math::rect::Rect; +use bezier_rs::Bezier; + +pub trait QuadExt { + /// Get all the edges in the rect as linear bezier curves + fn bezier_lines(&self) -> impl Iterator + '_; +} + +impl QuadExt for Quad { + fn bezier_lines(&self) -> impl Iterator + '_ { + self.all_edges().into_iter().map(|[start, end]| Bezier::from_linear_dvec2(start, end)) + } +} + +pub trait RectExt { + /// Get all the edges in the quad as linear bezier curves + fn bezier_lines(&self) -> impl Iterator + '_; +} + +impl RectExt for Rect { + fn bezier_lines(&self) -> impl Iterator + '_ { + self.edges().into_iter().map(|[start, end]| Bezier::from_linear_dvec2(start, end)) + } +} diff --git a/node-graph/gcore/src/math/mod.rs b/node-graph/gcore/src/math/mod.rs new file mode 100644 index 0000000000..06a1c21bc4 --- /dev/null +++ b/node-graph/gcore/src/math/mod.rs @@ -0,0 +1,4 @@ +pub mod bbox; +pub mod math_ext; +pub mod quad; +pub mod rect; diff --git a/node-graph/gcore/src/graphic_element/renderer/quad.rs b/node-graph/gcore/src/math/quad.rs similarity index 96% rename from node-graph/gcore/src/graphic_element/renderer/quad.rs rename to node-graph/gcore/src/math/quad.rs index 569f3e3d24..8586bba1cf 100644 --- a/node-graph/gcore/src/graphic_element/renderer/quad.rs +++ b/node-graph/gcore/src/math/quad.rs @@ -58,11 +58,6 @@ impl Quad { self.edges().into_iter().all(|[a, b]| (a - b).length_squared() >= width.powi(2)) } - /// Get all the edges in the quad as linear bezier curves - pub fn bezier_lines(&self) -> impl Iterator + '_ { - self.all_edges().into_iter().map(|[start, end]| bezier_rs::Bezier::from_linear_dvec2(start, end)) - } - /// Generates the axis aligned bounding box of the quad pub fn bounding_box(&self) -> [DVec2; 2] { [ diff --git a/node-graph/gcore/src/graphic_element/renderer/rect.rs b/node-graph/gcore/src/math/rect.rs similarity index 92% rename from node-graph/gcore/src/graphic_element/renderer/rect.rs rename to node-graph/gcore/src/math/rect.rs index b1de523b92..4998eddb3a 100644 --- a/node-graph/gcore/src/graphic_element/renderer/rect.rs +++ b/node-graph/gcore/src/math/rect.rs @@ -1,4 +1,4 @@ -use super::Quad; +use crate::math::quad::Quad; use glam::{DAffine2, DVec2}; #[derive(Debug, Clone, Default, Copy, PartialEq)] @@ -43,11 +43,6 @@ impl Rect { [[corners[0], corners[1]], [corners[1], corners[2]], [corners[2], corners[3]], [corners[3], corners[0]]] } - /// Get all the edges in the rect as linear bezier curves - pub fn bezier_lines(&self) -> impl Iterator + '_ { - self.edges().into_iter().map(|[start, end]| bezier_rs::Bezier::from_linear_dvec2(start, end)) - } - /// Gets the center of a rect #[must_use] pub fn center(&self) -> DVec2 { diff --git a/node-graph/gcore/src/raster.rs b/node-graph/gcore/src/raster.rs index 3d8a1ccff2..3bc6d4abcc 100644 --- a/node-graph/gcore/src/raster.rs +++ b/node-graph/gcore/src/raster.rs @@ -1,222 +1,25 @@ -pub use self::color::{Color, Luma, SRGBA8}; -use crate::Ctx; use crate::GraphicGroupTable; +pub use crate::color::*; use crate::raster_types::{CPU, RasterDataTable}; -use crate::registry::types::Percentage; use crate::vector::VectorDataTable; -use bytemuck::{Pod, Zeroable}; -use glam::DVec2; use std::fmt::Debug; #[cfg(target_arch = "spirv")] use spirv_std::num_traits::float::Float; +/// as to not yet rename all references +pub mod color { + pub use super::*; +} + pub mod adjustments; -pub mod bbox; pub mod brush_cache; -pub mod color; pub mod curve; -pub mod discrete_srgb; +pub mod image; +pub use self::image::Image; pub use adjustments::*; -pub trait Linear { - fn from_f32(x: f32) -> Self; - fn to_f32(self) -> f32; - fn from_f64(x: f64) -> Self; - fn to_f64(self) -> f64; - fn lerp(self, other: Self, value: Self) -> Self - where - Self: Sized + Copy, - Self: std::ops::Sub, - Self: std::ops::Mul, - Self: std::ops::Add, - { - self + (other - self) * value - } -} - -#[rustfmt::skip] -impl Linear for f32 { - #[inline(always)] fn from_f32(x: f32) -> Self { x } - #[inline(always)] fn to_f32(self) -> f32 { self } - #[inline(always)] fn from_f64(x: f64) -> Self { x as f32 } - #[inline(always)] fn to_f64(self) -> f64 { self as f64 } -} - -#[rustfmt::skip] -impl Linear for f64 { - #[inline(always)] fn from_f32(x: f32) -> Self { x as f64 } - #[inline(always)] fn to_f32(self) -> f32 { self as f32 } - #[inline(always)] fn from_f64(x: f64) -> Self { x } - #[inline(always)] fn to_f64(self) -> f64 { self } -} - -pub trait Channel: Copy + Debug { - fn to_linear(self) -> Out; - fn from_linear(linear: In) -> Self; -} - -pub trait LinearChannel: Channel { - fn cast_linear_channel(self) -> Out { - Out::from_linear(self.to_linear::()) - } -} - -impl Channel for T { - #[inline(always)] - fn to_linear(self) -> Out { - Out::from_f64(self.to_f64()) - } - - #[inline(always)] - fn from_linear(linear: In) -> Self { - Self::from_f64(linear.to_f64()) - } -} - -impl LinearChannel for T {} - -use num_derive::*; -#[derive(Copy, Clone, Debug, PartialEq, PartialOrd, Num, NumCast, NumOps, One, Zero, ToPrimitive, FromPrimitive)] -pub struct SRGBGammaFloat(f32); - -impl Channel for SRGBGammaFloat { - #[inline(always)] - fn to_linear(self) -> Out { - let x = self.0; - Out::from_f32(if x <= 0.04045 { x / 12.92 } else { ((x + 0.055) / 1.055).powf(2.4) }) - } - - #[inline(always)] - fn from_linear(linear: In) -> Self { - let x = linear.to_f32(); - if x <= 0.0031308 { Self(x * 12.92) } else { Self(1.055 * x.powf(1. / 2.4) - 0.055) } - } -} -pub trait RGBPrimaries { - const RED: DVec2; - const GREEN: DVec2; - const BLUE: DVec2; - const WHITE: DVec2; -} -pub trait Rec709Primaries {} -impl RGBPrimaries for T { - const RED: DVec2 = DVec2::new(0.64, 0.33); - const GREEN: DVec2 = DVec2::new(0.3, 0.6); - const BLUE: DVec2 = DVec2::new(0.15, 0.06); - const WHITE: DVec2 = DVec2::new(0.3127, 0.329); -} - -pub trait SRGB: Rec709Primaries {} - -pub trait Serde: serde::Serialize + for<'a> serde::Deserialize<'a> {} -#[cfg(not(feature = "serde"))] -pub trait Serde {} - -impl serde::Deserialize<'a>> Serde for T {} -#[cfg(not(feature = "serde"))] -impl Serde for T {} - -// TODO: Come up with a better name for this trait -pub trait Pixel: Clone + Pod + Zeroable + Default { - #[cfg(not(target_arch = "spirv"))] - fn to_bytes(&self) -> Vec { - bytemuck::bytes_of(self).to_vec() - } - // TODO: use u8 for Color - fn from_bytes(bytes: &[u8]) -> Self { - *bytemuck::try_from_bytes(bytes).expect("Failed to convert bytes to pixel") - } - - fn byte_size() -> usize { - size_of::() - } -} -pub trait RGB: Pixel { - type ColorChannel: Channel; - - fn red(&self) -> Self::ColorChannel; - fn r(&self) -> Self::ColorChannel { - self.red() - } - fn green(&self) -> Self::ColorChannel; - fn g(&self) -> Self::ColorChannel { - self.green() - } - fn blue(&self) -> Self::ColorChannel; - fn b(&self) -> Self::ColorChannel { - self.blue() - } -} -pub trait RGBMut: RGB { - fn set_red(&mut self, red: Self::ColorChannel); - fn set_green(&mut self, green: Self::ColorChannel); - fn set_blue(&mut self, blue: Self::ColorChannel); -} - -pub trait AssociatedAlpha: RGB + Alpha { - fn to_unassociated(&self) -> Out; -} - -pub trait UnassociatedAlpha: RGB + Alpha { - fn to_associated(&self) -> Out; -} - -pub trait Alpha { - type AlphaChannel: LinearChannel; - const TRANSPARENT: Self; - fn alpha(&self) -> Self::AlphaChannel; - fn a(&self) -> Self::AlphaChannel { - self.alpha() - } - fn multiplied_alpha(&self, alpha: Self::AlphaChannel) -> Self; -} -pub trait AlphaMut: Alpha { - fn set_alpha(&mut self, value: Self::AlphaChannel); -} - -pub trait Depth { - type DepthChannel: Channel; - fn depth(&self) -> Self::DepthChannel; - fn d(&self) -> Self::DepthChannel { - self.depth() - } -} - -pub trait ExtraChannels { - type ChannelType: Channel; - fn extra_channels(&self) -> [Self::ChannelType; NUM]; -} - -pub trait Luminance { - type LuminanceChannel: LinearChannel; - fn luminance(&self) -> Self::LuminanceChannel; - fn l(&self) -> Self::LuminanceChannel { - self.luminance() - } -} - -pub trait LuminanceMut: Luminance { - fn set_luminance(&mut self, luminance: Self::LuminanceChannel); -} - -// TODO: We might rename this to Raster at some point -pub trait Sample { - type Pixel: Pixel; - // TODO: Add an area parameter - fn sample(&self, pos: DVec2, area: DVec2) -> Option; -} - -impl Sample for &T { - type Pixel = T::Pixel; - - #[inline(always)] - fn sample(&self, pos: DVec2, area: DVec2) -> Option { - (**self).sample(pos, area) - } -} - pub trait Bitmap { type Pixel: Pixel; fn width(&self) -> u32; @@ -282,112 +85,3 @@ impl BitmapMut for &mut T { (*self).get_pixel_mut(x, y) } } - -pub use self::image::Image; -pub mod image; - -trait SetBlendMode { - fn set_blend_mode(&mut self, blend_mode: BlendMode); -} - -impl SetBlendMode for VectorDataTable { - fn set_blend_mode(&mut self, blend_mode: BlendMode) { - for instance in self.instance_mut_iter() { - instance.alpha_blending.blend_mode = blend_mode; - } - } -} -impl SetBlendMode for GraphicGroupTable { - fn set_blend_mode(&mut self, blend_mode: BlendMode) { - for instance in self.instance_mut_iter() { - instance.alpha_blending.blend_mode = blend_mode; - } - } -} -impl SetBlendMode for RasterDataTable { - fn set_blend_mode(&mut self, blend_mode: BlendMode) { - for instance in self.instance_mut_iter() { - instance.alpha_blending.blend_mode = blend_mode; - } - } -} - -trait SetClip { - fn set_clip(&mut self, clip: bool); -} - -impl SetClip for VectorDataTable { - fn set_clip(&mut self, clip: bool) { - for instance in self.instance_mut_iter() { - instance.alpha_blending.clip = clip; - } - } -} -impl SetClip for GraphicGroupTable { - fn set_clip(&mut self, clip: bool) { - for instance in self.instance_mut_iter() { - instance.alpha_blending.clip = clip; - } - } -} -impl SetClip for RasterDataTable { - fn set_clip(&mut self, clip: bool) { - for instance in self.instance_mut_iter() { - instance.alpha_blending.clip = clip; - } - } -} - -#[node_macro::node(category("Style"))] -fn blend_mode( - _: impl Ctx, - #[implementations( - GraphicGroupTable, - VectorDataTable, - RasterDataTable, - )] - mut value: T, - blend_mode: BlendMode, -) -> T { - // TODO: Find a way to make this apply once to the table's parent (i.e. its row in its parent table or Instance) rather than applying to each row in its own table, which produces the undesired result - value.set_blend_mode(blend_mode); - value -} - -#[node_macro::node(category("Style"))] -fn opacity( - _: impl Ctx, - #[implementations( - GraphicGroupTable, - VectorDataTable, - RasterDataTable, - )] - mut value: T, - #[default(100.)] opacity: Percentage, -) -> T { - // TODO: Find a way to make this apply once to the table's parent (i.e. its row in its parent table or Instance) rather than applying to each row in its own table, which produces the undesired result - value.multiply_alpha(opacity / 100.); - value -} - -#[node_macro::node(category("Style"))] -fn blending( - _: impl Ctx, - #[implementations( - GraphicGroupTable, - VectorDataTable, - RasterDataTable, - )] - mut value: T, - blend_mode: BlendMode, - #[default(100.)] opacity: Percentage, - #[default(100.)] fill: Percentage, - #[default(false)] clip: bool, -) -> T { - // TODO: Find a way to make this apply once to the table's parent (i.e. its row in its parent table or Instance) rather than applying to each row in its own table, which produces the undesired result - value.set_blend_mode(blend_mode); - value.multiply_alpha(opacity / 100.); - value.multiply_fill(fill / 100.); - value.set_clip(clip); - value -} diff --git a/node-graph/gcore/src/raster/adjustments.rs b/node-graph/gcore/src/raster/adjustments.rs index a39caa81c8..c2c52eb132 100644 --- a/node-graph/gcore/src/raster/adjustments.rs +++ b/node-graph/gcore/src/raster/adjustments.rs @@ -1,15 +1,15 @@ #![allow(clippy::too_many_arguments)] +use crate::GraphicElement; +use crate::blending::BlendMode; use crate::raster::curve::{CubicSplines, CurveManipulatorGroup}; use crate::raster::curve::{Curve, ValueMapperNode}; use crate::raster::image::Image; use crate::raster::{Channel, Color, Pixel}; use crate::raster_types::{CPU, Raster, RasterDataTable}; use crate::registry::types::{Angle, Percentage, SignedPercentage}; -use crate::vector::VectorDataTable; use crate::vector::style::GradientStops; use crate::{Ctx, Node}; -use crate::{GraphicElement, GraphicGroupTable}; use dyn_any::DynAny; use std::cmp::Ordering; use std::fmt::Debug; @@ -41,217 +41,6 @@ pub enum LuminanceCalculation { MaximumChannels, } -#[derive(Debug, Default, Clone, Copy, Eq, PartialEq, DynAny, Hash, specta::Type, serde::Serialize, serde::Deserialize)] -#[repr(i32)] // TODO: Enable Int8 capability for SPIR-V so that we don't need this? -pub enum BlendMode { - // Basic group - #[default] - Normal, - - // Darken group - Darken, - Multiply, - ColorBurn, - LinearBurn, - DarkerColor, - - // Lighten group - Lighten, - Screen, - ColorDodge, - LinearDodge, - LighterColor, - - // Contrast group - Overlay, - SoftLight, - HardLight, - VividLight, - LinearLight, - PinLight, - HardMix, - - // Inversion group - Difference, - Exclusion, - Subtract, - Divide, - - // Component group - Hue, - Saturation, - Color, - Luminosity, - - // Other stuff - Erase, - Restore, - MultiplyAlpha, -} - -impl BlendMode { - /// All standard blend modes ordered by group. - pub fn list() -> [&'static [BlendMode]; 6] { - use BlendMode::*; - [ - // Normal group - &[Normal], - // Darken group - &[Darken, Multiply, ColorBurn, LinearBurn, DarkerColor], - // Lighten group - &[Lighten, Screen, ColorDodge, LinearDodge, LighterColor], - // Contrast group - &[Overlay, SoftLight, HardLight, VividLight, LinearLight, PinLight, HardMix], - // Inversion group - &[Difference, Exclusion, Subtract, Divide], - // Component group - &[Hue, Saturation, Color, Luminosity], - ] - } - - /// The subset of [`BlendMode::list()`] that is supported by SVG. - pub fn list_svg_subset() -> [&'static [BlendMode]; 6] { - use BlendMode::*; - [ - // Normal group - &[Normal], - // Darken group - &[Darken, Multiply, ColorBurn], - // Lighten group - &[Lighten, Screen, ColorDodge], - // Contrast group - &[Overlay, SoftLight, HardLight], - // Inversion group - &[Difference, Exclusion], - // Component group - &[Hue, Saturation, Color, Luminosity], - ] - } - - pub fn index_in_list(&self) -> Option { - Self::list().iter().flat_map(|x| x.iter()).position(|&blend_mode| blend_mode == *self) - } - - pub fn index_in_list_svg_subset(&self) -> Option { - Self::list_svg_subset().iter().flat_map(|x| x.iter()).position(|&blend_mode| blend_mode == *self) - } - - /// Convert the enum to the CSS string for the blend mode. - /// [Read more](https://developer.mozilla.org/en-US/docs/Web/CSS/blend-mode#values) - pub fn to_svg_style_name(&self) -> Option<&'static str> { - match self { - // Normal group - BlendMode::Normal => Some("normal"), - // Darken group - BlendMode::Darken => Some("darken"), - BlendMode::Multiply => Some("multiply"), - BlendMode::ColorBurn => Some("color-burn"), - // Lighten group - BlendMode::Lighten => Some("lighten"), - BlendMode::Screen => Some("screen"), - BlendMode::ColorDodge => Some("color-dodge"), - // Contrast group - BlendMode::Overlay => Some("overlay"), - BlendMode::SoftLight => Some("soft-light"), - BlendMode::HardLight => Some("hard-light"), - // Inversion group - BlendMode::Difference => Some("difference"), - BlendMode::Exclusion => Some("exclusion"), - // Component group - BlendMode::Hue => Some("hue"), - BlendMode::Saturation => Some("saturation"), - BlendMode::Color => Some("color"), - BlendMode::Luminosity => Some("luminosity"), - _ => None, - } - } - - /// Renders the blend mode CSS style declaration. - pub fn render(&self) -> String { - format!( - r#" mix-blend-mode: {};"#, - self.to_svg_style_name().unwrap_or_else(|| { - warn!("Unsupported blend mode {self:?}"); - "normal" - }) - ) - } -} - -impl std::fmt::Display for BlendMode { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - // Normal group - BlendMode::Normal => write!(f, "Normal"), - // Darken group - BlendMode::Darken => write!(f, "Darken"), - BlendMode::Multiply => write!(f, "Multiply"), - BlendMode::ColorBurn => write!(f, "Color Burn"), - BlendMode::LinearBurn => write!(f, "Linear Burn"), - BlendMode::DarkerColor => write!(f, "Darker Color"), - // Lighten group - BlendMode::Lighten => write!(f, "Lighten"), - BlendMode::Screen => write!(f, "Screen"), - BlendMode::ColorDodge => write!(f, "Color Dodge"), - BlendMode::LinearDodge => write!(f, "Linear Dodge"), - BlendMode::LighterColor => write!(f, "Lighter Color"), - // Contrast group - BlendMode::Overlay => write!(f, "Overlay"), - BlendMode::SoftLight => write!(f, "Soft Light"), - BlendMode::HardLight => write!(f, "Hard Light"), - BlendMode::VividLight => write!(f, "Vivid Light"), - BlendMode::LinearLight => write!(f, "Linear Light"), - BlendMode::PinLight => write!(f, "Pin Light"), - BlendMode::HardMix => write!(f, "Hard Mix"), - // Inversion group - BlendMode::Difference => write!(f, "Difference"), - BlendMode::Exclusion => write!(f, "Exclusion"), - BlendMode::Subtract => write!(f, "Subtract"), - BlendMode::Divide => write!(f, "Divide"), - // Component group - BlendMode::Hue => write!(f, "Hue"), - BlendMode::Saturation => write!(f, "Saturation"), - BlendMode::Color => write!(f, "Color"), - BlendMode::Luminosity => write!(f, "Luminosity"), - // Other utility blend modes (hidden from the normal list) - BlendMode::Erase => write!(f, "Erase"), - BlendMode::Restore => write!(f, "Restore"), - BlendMode::MultiplyAlpha => write!(f, "Multiply Alpha"), - } - } -} - -#[cfg(feature = "vello")] -impl From for vello::peniko::Mix { - fn from(val: BlendMode) -> Self { - match val { - // Normal group - BlendMode::Normal => vello::peniko::Mix::Normal, - // Darken group - BlendMode::Darken => vello::peniko::Mix::Darken, - BlendMode::Multiply => vello::peniko::Mix::Multiply, - BlendMode::ColorBurn => vello::peniko::Mix::ColorBurn, - // Lighten group - BlendMode::Lighten => vello::peniko::Mix::Lighten, - BlendMode::Screen => vello::peniko::Mix::Screen, - BlendMode::ColorDodge => vello::peniko::Mix::ColorDodge, - // Contrast group - BlendMode::Overlay => vello::peniko::Mix::Overlay, - BlendMode::SoftLight => vello::peniko::Mix::SoftLight, - BlendMode::HardLight => vello::peniko::Mix::HardLight, - // Inversion group - BlendMode::Difference => vello::peniko::Mix::Difference, - BlendMode::Exclusion => vello::peniko::Mix::Exclusion, - // Component group - BlendMode::Hue => vello::peniko::Mix::Hue, - BlendMode::Saturation => vello::peniko::Mix::Saturation, - BlendMode::Color => vello::peniko::Mix::Color, - BlendMode::Luminosity => vello::peniko::Mix::Luminosity, - _ => todo!(), - } - } -} - #[node_macro::node(category("Raster: Adjustment"))] fn luminance>( _: impl Ctx, @@ -1272,70 +1061,6 @@ async fn selective_color>( image } -pub(super) trait MultiplyAlpha { - fn multiply_alpha(&mut self, factor: f64); -} - -impl MultiplyAlpha for Color { - fn multiply_alpha(&mut self, factor: f64) { - *self = Color::from_rgbaf32_unchecked(self.r(), self.g(), self.b(), (self.a() * factor as f32).clamp(0., 1.)) - } -} -impl MultiplyAlpha for VectorDataTable { - fn multiply_alpha(&mut self, factor: f64) { - for instance in self.instance_mut_iter() { - instance.alpha_blending.opacity *= factor as f32; - } - } -} -impl MultiplyAlpha for GraphicGroupTable { - fn multiply_alpha(&mut self, factor: f64) { - for instance in self.instance_mut_iter() { - instance.alpha_blending.opacity *= factor as f32; - } - } -} -impl MultiplyAlpha for RasterDataTable -where - GraphicElement: From>, -{ - fn multiply_alpha(&mut self, factor: f64) { - for instance in self.instance_mut_iter() { - instance.alpha_blending.opacity *= factor as f32; - } - } -} - -pub(super) trait MultiplyFill { - fn multiply_fill(&mut self, factor: f64); -} -impl MultiplyFill for Color { - fn multiply_fill(&mut self, factor: f64) { - *self = Color::from_rgbaf32_unchecked(self.r(), self.g(), self.b(), (self.a() * factor as f32).clamp(0., 1.)) - } -} -impl MultiplyFill for VectorDataTable { - fn multiply_fill(&mut self, factor: f64) { - for instance in self.instance_mut_iter() { - instance.alpha_blending.fill *= factor as f32; - } - } -} -impl MultiplyFill for GraphicGroupTable { - fn multiply_fill(&mut self, factor: f64) { - for instance in self.instance_mut_iter() { - instance.alpha_blending.fill *= factor as f32; - } - } -} -impl MultiplyFill for RasterDataTable { - fn multiply_fill(&mut self, factor: f64) { - for instance in self.instance_mut_iter() { - instance.alpha_blending.fill *= factor as f32; - } - } -} - // Aims for interoperable compatibility with: // https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#:~:text=nvrt%27%20%3D%20Invert-,%27post%27%20%3D%20Posterize,-%27thrs%27%20%3D%20Threshold // @@ -1499,22 +1224,10 @@ fn color_overlay>( #[cfg(test)] mod test { - use crate::raster::adjustments::BlendMode; + use crate::Color; + use crate::blending::BlendMode; use crate::raster::image::Image; use crate::raster_types::{Raster, RasterDataTable}; - use crate::{Color, Node}; - use std::pin::Pin; - - #[derive(Clone)] - pub struct FutureWrapperNode(T); - - impl<'i, T: 'i + Clone + Send> Node<'i, ()> for FutureWrapperNode { - type Output = Pin + 'i + Send>>; - fn eval(&'i self, _input: ()) -> Self::Output { - let value = self.0.clone(); - Box::pin(async move { value }) - } - } #[tokio::test] async fn color_overlay_multiply() { diff --git a/node-graph/gcore/src/raster/image.rs b/node-graph/gcore/src/raster/image.rs index 1c920a16e7..b3b708495a 100644 --- a/node-graph/gcore/src/raster/image.rs +++ b/node-graph/gcore/src/raster/image.rs @@ -1,6 +1,6 @@ use super::Color; -use super::discrete_srgb::float_to_srgb_u8; use crate::AlphaBlending; +use crate::color::float_to_srgb_u8; use crate::instances::{Instance, Instances}; use crate::raster_types::Raster; use core::hash::{Hash, Hasher}; diff --git a/node-graph/gcore/src/registry.rs b/node-graph/gcore/src/registry.rs index 4a7cbdbff0..2727a95759 100644 --- a/node-graph/gcore/src/registry.rs +++ b/node-graph/gcore/src/registry.rs @@ -59,7 +59,7 @@ pub struct FieldMetadata { pub unit: Option<&'static str>, } -pub trait ChoiceTypeStatic: Sized + Copy + crate::vector::misc::AsU32 + Send + Sync { +pub trait ChoiceTypeStatic: Sized + Copy + crate::AsU32 + Send + Sync { const WIDGET_HINT: ChoiceWidgetHint; const DESCRIPTION: Option<&'static str>; fn list() -> &'static [&'static [(Self, VariantMetadata)]]; diff --git a/node-graph/gcore/src/transform.rs b/node-graph/gcore/src/transform.rs index e1587ec729..dafd3791b7 100644 --- a/node-graph/gcore/src/transform.rs +++ b/node-graph/gcore/src/transform.rs @@ -1,8 +1,6 @@ -use crate::instances::Instances; -use crate::raster::bbox::AxisAlignedBbox; -use crate::raster_types::{CPU, GPU, RasterDataTable}; -use crate::vector::VectorDataTable; -use crate::{Artboard, CloneVarArgs, Context, Ctx, ExtractAll, GraphicGroupTable, OwnedContextImpl}; +use crate::Artboard; +use crate::math::bbox::AxisAlignedBbox; +pub use crate::vector::ReferencePoint; use core::f64; use glam::{DAffine2, DMat2, DVec2}; @@ -152,186 +150,3 @@ impl ApplyTransform for T { impl ApplyTransform for () { fn apply_transform(&mut self, &_modification: &DAffine2) {} } - -#[node_macro::node(category(""))] -async fn transform( - ctx: impl Ctx + CloneVarArgs + ExtractAll, - #[implementations( - Context -> VectorDataTable, - Context -> GraphicGroupTable, - Context -> RasterDataTable, - Context -> RasterDataTable, - )] - transform_target: impl Node, Output = Instances>, - translate: DVec2, - rotate: f64, - scale: DVec2, - shear: DVec2, - _pivot: DVec2, -) -> Instances { - let matrix = DAffine2::from_scale_angle_translation(scale, rotate, translate) * DAffine2::from_cols_array(&[1., shear.y, shear.x, 1., 0., 0.]); - - let footprint = ctx.try_footprint().copied(); - - let mut ctx = OwnedContextImpl::from(ctx); - if let Some(mut footprint) = footprint { - footprint.apply_transform(&matrix); - ctx = ctx.with_footprint(footprint); - } - - let mut transform_target = transform_target.eval(ctx.into_context()).await; - - for data_transform in transform_target.instance_mut_iter() { - *data_transform.transform = matrix * *data_transform.transform; - } - - transform_target -} - -#[node_macro::node(category(""))] -fn replace_transform( - _: impl Ctx, - #[implementations(VectorDataTable, RasterDataTable, GraphicGroupTable)] mut data: Instances, - #[implementations(DAffine2)] transform: TransformInput, -) -> Instances { - for data_transform in data.instance_mut_iter() { - *data_transform.transform = transform.transform(); - } - data -} - -#[node_macro::node(category("Debug"))] -async fn boundless_footprint( - ctx: impl Ctx + CloneVarArgs + ExtractAll, - #[implementations( - Context -> VectorDataTable, - Context -> GraphicGroupTable, - Context -> RasterDataTable, - Context -> RasterDataTable, - Context -> String, - Context -> f64, - )] - transform_target: impl Node, Output = T>, -) -> T { - let ctx = OwnedContextImpl::from(ctx).with_footprint(Footprint::BOUNDLESS); - - transform_target.eval(ctx.into_context()).await -} -#[node_macro::node(category("Debug"))] -async fn freeze_real_time( - ctx: impl Ctx + CloneVarArgs + ExtractAll, - #[implementations( - Context -> VectorDataTable, - Context -> GraphicGroupTable, - Context -> RasterDataTable, - Context -> RasterDataTable, - Context -> String, - Context -> f64, - )] - transform_target: impl Node, Output = T>, -) -> T { - let ctx = OwnedContextImpl::from(ctx).with_real_time(0.); - - transform_target.eval(ctx.into_context()).await -} - -#[derive(Clone, Copy, Debug, Default, Hash, Eq, PartialEq, dyn_any::DynAny, serde::Serialize, serde::Deserialize, specta::Type)] -pub enum ReferencePoint { - #[default] - None, - TopLeft, - TopCenter, - TopRight, - CenterLeft, - Center, - CenterRight, - BottomLeft, - BottomCenter, - BottomRight, -} - -impl ReferencePoint { - pub fn point_in_bounding_box(&self, bounding_box: AxisAlignedBbox) -> Option { - let size = bounding_box.size(); - let offset = match self { - ReferencePoint::None => return None, - ReferencePoint::TopLeft => DVec2::ZERO, - ReferencePoint::TopCenter => DVec2::new(size.x / 2., 0.), - ReferencePoint::TopRight => DVec2::new(size.x, 0.), - ReferencePoint::CenterLeft => DVec2::new(0., size.y / 2.), - ReferencePoint::Center => DVec2::new(size.x / 2., size.y / 2.), - ReferencePoint::CenterRight => DVec2::new(size.x, size.y / 2.), - ReferencePoint::BottomLeft => DVec2::new(0., size.y), - ReferencePoint::BottomCenter => DVec2::new(size.x / 2., size.y), - ReferencePoint::BottomRight => DVec2::new(size.x, size.y), - }; - Some(bounding_box.start + offset) - } -} - -impl From<&str> for ReferencePoint { - fn from(input: &str) -> Self { - match input { - "None" => ReferencePoint::None, - "TopLeft" => ReferencePoint::TopLeft, - "TopCenter" => ReferencePoint::TopCenter, - "TopRight" => ReferencePoint::TopRight, - "CenterLeft" => ReferencePoint::CenterLeft, - "Center" => ReferencePoint::Center, - "CenterRight" => ReferencePoint::CenterRight, - "BottomLeft" => ReferencePoint::BottomLeft, - "BottomCenter" => ReferencePoint::BottomCenter, - "BottomRight" => ReferencePoint::BottomRight, - _ => panic!("Failed parsing unrecognized ReferencePosition enum value '{input}'"), - } - } -} - -impl From for Option { - fn from(input: ReferencePoint) -> Self { - match input { - ReferencePoint::None => None, - ReferencePoint::TopLeft => Some(DVec2::new(0., 0.)), - ReferencePoint::TopCenter => Some(DVec2::new(0.5, 0.)), - ReferencePoint::TopRight => Some(DVec2::new(1., 0.)), - ReferencePoint::CenterLeft => Some(DVec2::new(0., 0.5)), - ReferencePoint::Center => Some(DVec2::new(0.5, 0.5)), - ReferencePoint::CenterRight => Some(DVec2::new(1., 0.5)), - ReferencePoint::BottomLeft => Some(DVec2::new(0., 1.)), - ReferencePoint::BottomCenter => Some(DVec2::new(0.5, 1.)), - ReferencePoint::BottomRight => Some(DVec2::new(1., 1.)), - } - } -} - -impl From for ReferencePoint { - fn from(input: DVec2) -> Self { - const TOLERANCE: f64 = 1e-5_f64; - if input.y.abs() < TOLERANCE { - if input.x.abs() < TOLERANCE { - return ReferencePoint::TopLeft; - } else if (input.x - 0.5).abs() < TOLERANCE { - return ReferencePoint::TopCenter; - } else if (input.x - 1.).abs() < TOLERANCE { - return ReferencePoint::TopRight; - } - } else if (input.y - 0.5).abs() < TOLERANCE { - if input.x.abs() < TOLERANCE { - return ReferencePoint::CenterLeft; - } else if (input.x - 0.5).abs() < TOLERANCE { - return ReferencePoint::Center; - } else if (input.x - 1.).abs() < TOLERANCE { - return ReferencePoint::CenterRight; - } - } else if (input.y - 1.).abs() < TOLERANCE { - if input.x.abs() < TOLERANCE { - return ReferencePoint::BottomLeft; - } else if (input.x - 0.5).abs() < TOLERANCE { - return ReferencePoint::BottomCenter; - } else if (input.x - 1.).abs() < TOLERANCE { - return ReferencePoint::BottomRight; - } - } - ReferencePoint::None - } -} diff --git a/node-graph/gcore/src/transform_nodes.rs b/node-graph/gcore/src/transform_nodes.rs new file mode 100644 index 0000000000..39024681e6 --- /dev/null +++ b/node-graph/gcore/src/transform_nodes.rs @@ -0,0 +1,89 @@ +use crate::instances::Instances; +use crate::raster_types::{CPU, GPU, RasterDataTable}; +use crate::transform::{ApplyTransform, Footprint, Transform}; +use crate::vector::VectorDataTable; +use crate::{CloneVarArgs, Context, Ctx, ExtractAll, GraphicGroupTable, OwnedContextImpl}; +use core::f64; +use glam::{DAffine2, DVec2}; + +#[node_macro::node(category(""))] +async fn transform( + ctx: impl Ctx + CloneVarArgs + ExtractAll, + #[implementations( + Context -> VectorDataTable, + Context -> GraphicGroupTable, + Context -> RasterDataTable, + Context -> RasterDataTable, + )] + transform_target: impl Node, Output = Instances>, + translate: DVec2, + rotate: f64, + scale: DVec2, + shear: DVec2, + _pivot: DVec2, +) -> Instances { + let matrix = DAffine2::from_scale_angle_translation(scale, rotate, translate) * DAffine2::from_cols_array(&[1., shear.y, shear.x, 1., 0., 0.]); + + let footprint = ctx.try_footprint().copied(); + + let mut ctx = OwnedContextImpl::from(ctx); + if let Some(mut footprint) = footprint { + footprint.apply_transform(&matrix); + ctx = ctx.with_footprint(footprint); + } + + let mut transform_target = transform_target.eval(ctx.into_context()).await; + + for data_transform in transform_target.instance_mut_iter() { + *data_transform.transform = matrix * *data_transform.transform; + } + + transform_target +} + +#[node_macro::node(category(""))] +fn replace_transform( + _: impl Ctx, + #[implementations(VectorDataTable, RasterDataTable, GraphicGroupTable)] mut data: Instances, + #[implementations(DAffine2)] transform: TransformInput, +) -> Instances { + for data_transform in data.instance_mut_iter() { + *data_transform.transform = transform.transform(); + } + data +} + +#[node_macro::node(category("Debug"))] +async fn boundless_footprint( + ctx: impl Ctx + CloneVarArgs + ExtractAll, + #[implementations( + Context -> VectorDataTable, + Context -> GraphicGroupTable, + Context -> RasterDataTable, + Context -> RasterDataTable, + Context -> String, + Context -> f64, + )] + transform_target: impl Node, Output = T>, +) -> T { + let ctx = OwnedContextImpl::from(ctx).with_footprint(Footprint::BOUNDLESS); + + transform_target.eval(ctx.into_context()).await +} +#[node_macro::node(category("Debug"))] +async fn freeze_real_time( + ctx: impl Ctx + CloneVarArgs + ExtractAll, + #[implementations( + Context -> VectorDataTable, + Context -> GraphicGroupTable, + Context -> RasterDataTable, + Context -> RasterDataTable, + Context -> String, + Context -> f64, + )] + transform_target: impl Node, Output = T>, +) -> T { + let ctx = OwnedContextImpl::from(ctx).with_real_time(0.); + + transform_target.eval(ctx.into_context()).await +} diff --git a/node-graph/gcore/src/vector/brush_stroke.rs b/node-graph/gcore/src/vector/brush_stroke.rs index e1c2ae6342..17ec7fe44c 100644 --- a/node-graph/gcore/src/vector/brush_stroke.rs +++ b/node-graph/gcore/src/vector/brush_stroke.rs @@ -1,6 +1,6 @@ use crate::Color; +use crate::math::bbox::AxisAlignedBbox; use crate::raster::BlendMode; -use crate::raster::bbox::AxisAlignedBbox; use dyn_any::DynAny; use glam::DVec2; use std::hash::{Hash, Hasher}; diff --git a/node-graph/gcore/src/vector/click_target.rs b/node-graph/gcore/src/vector/click_target.rs new file mode 100644 index 0000000000..a1d068682f --- /dev/null +++ b/node-graph/gcore/src/vector/click_target.rs @@ -0,0 +1,162 @@ +use crate::math::math_ext::QuadExt; +use crate::renderer::Quad; +use crate::vector::PointId; +use bezier_rs::Subpath; +use glam::{DAffine2, DMat2, DVec2}; + +#[derive(Copy, Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)] +pub struct FreePoint { + pub id: PointId, + pub position: DVec2, +} + +impl FreePoint { + pub fn new(id: PointId, position: DVec2) -> Self { + Self { id, position } + } + + pub fn apply_transform(&mut self, transform: DAffine2) { + self.position = transform.transform_point2(self.position); + } +} + +#[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)] +pub enum ClickTargetType { + Subpath(Subpath), + FreePoint(FreePoint), +} + +/// Represents a clickable target for the layer +#[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)] +pub struct ClickTarget { + target_type: ClickTargetType, + stroke_width: f64, + bounding_box: Option<[DVec2; 2]>, +} + +impl ClickTarget { + pub fn new_with_subpath(subpath: Subpath, stroke_width: f64) -> Self { + let bounding_box = subpath.loose_bounding_box(); + Self { + target_type: ClickTargetType::Subpath(subpath), + stroke_width, + bounding_box, + } + } + + pub fn new_with_free_point(point: FreePoint) -> Self { + const MAX_LENGTH_FOR_NO_WIDTH_OR_HEIGHT: f64 = 1e-4 / 2.; + let stroke_width = 10.; + let bounding_box = Some([ + point.position - DVec2::splat(MAX_LENGTH_FOR_NO_WIDTH_OR_HEIGHT), + point.position + DVec2::splat(MAX_LENGTH_FOR_NO_WIDTH_OR_HEIGHT), + ]); + + Self { + target_type: ClickTargetType::FreePoint(point), + stroke_width, + bounding_box, + } + } + + pub fn target_type(&self) -> &ClickTargetType { + &self.target_type + } + + pub fn bounding_box(&self) -> Option<[DVec2; 2]> { + self.bounding_box + } + + pub fn bounding_box_with_transform(&self, transform: DAffine2) -> Option<[DVec2; 2]> { + self.bounding_box.map(|[a, b]| [transform.transform_point2(a), transform.transform_point2(b)]) + } + + pub fn apply_transform(&mut self, affine_transform: DAffine2) { + match self.target_type { + ClickTargetType::Subpath(ref mut subpath) => { + subpath.apply_transform(affine_transform); + } + ClickTargetType::FreePoint(ref mut point) => { + point.apply_transform(affine_transform); + } + } + self.update_bbox(); + } + + fn update_bbox(&mut self) { + match self.target_type { + ClickTargetType::Subpath(ref subpath) => { + self.bounding_box = subpath.bounding_box(); + } + ClickTargetType::FreePoint(ref point) => { + self.bounding_box = Some([point.position - DVec2::splat(self.stroke_width / 2.), point.position + DVec2::splat(self.stroke_width / 2.)]); + } + } + } + + /// Does the click target intersect the path + pub fn intersect_path>(&self, mut bezier_iter: impl FnMut() -> It, layer_transform: DAffine2) -> bool { + // Check if the matrix is not invertible + let mut layer_transform = layer_transform; + if layer_transform.matrix2.determinant().abs() <= f64::EPSILON { + layer_transform.matrix2 += DMat2::IDENTITY * 1e-4; // TODO: Is this the cleanest way to handle this? + } + + let inverse = layer_transform.inverse(); + let mut bezier_iter = || bezier_iter().map(|bezier| bezier.apply_transformation(|point| inverse.transform_point2(point))); + + match self.target_type() { + ClickTargetType::Subpath(subpath) => { + // Check if outlines intersect + let outline_intersects = |path_segment: bezier_rs::Bezier| bezier_iter().any(|line| !path_segment.intersections(&line, None, None).is_empty()); + if subpath.iter().any(outline_intersects) { + return true; + } + // Check if selection is entirely within the shape + if subpath.closed() && bezier_iter().next().is_some_and(|bezier| subpath.contains_point(bezier.start)) { + return true; + } + + // Check if shape is entirely within selection + let any_point_from_subpath = subpath.manipulator_groups().first().map(|group| group.anchor); + any_point_from_subpath.is_some_and(|shape_point| bezier_iter().map(|bezier| bezier.winding(shape_point)).sum::() != 0) + } + ClickTargetType::FreePoint(point) => bezier_iter().map(|bezier: bezier_rs::Bezier| bezier.winding(point.position)).sum::() != 0, + } + } + + /// Does the click target intersect the point (accounting for stroke size) + pub fn intersect_point(&self, point: DVec2, layer_transform: DAffine2) -> bool { + let target_bounds = [point - DVec2::splat(self.stroke_width / 2.), point + DVec2::splat(self.stroke_width / 2.)]; + let intersects = |a: [DVec2; 2], b: [DVec2; 2]| a[0].x <= b[1].x && a[1].x >= b[0].x && a[0].y <= b[1].y && a[1].y >= b[0].y; + // This bounding box is not very accurate as it is the axis aligned version of the transformed bounding box. However it is fast. + if !self + .bounding_box + .is_some_and(|loose| (loose[0] - loose[1]).abs().cmpgt(DVec2::splat(1e-4)).any() && intersects((layer_transform * Quad::from_box(loose)).bounding_box(), target_bounds)) + { + return false; + } + + // Allows for selecting lines + // TODO: actual intersection of stroke + let inflated_quad = Quad::from_box(target_bounds); + self.intersect_path(|| inflated_quad.bezier_lines(), layer_transform) + } + + /// Does the click target intersect the point (not accounting for stroke size) + pub fn intersect_point_no_stroke(&self, point: DVec2) -> bool { + // Check if the point is within the bounding box + if self + .bounding_box + .is_some_and(|bbox| bbox[0].x <= point.x && point.x <= bbox[1].x && bbox[0].y <= point.y && point.y <= bbox[1].y) + { + // Check if the point is within the shape + match self.target_type() { + ClickTargetType::Subpath(subpath) => subpath.closed() && subpath.contains_point(point), + ClickTargetType::FreePoint(free_point) => free_point.position == point, + } + } else { + false + } + } +} diff --git a/node-graph/gcore/src/vector/misc.rs b/node-graph/gcore/src/vector/misc.rs index f29286b605..e8b2bef9ca 100644 --- a/node-graph/gcore/src/vector/misc.rs +++ b/node-graph/gcore/src/vector/misc.rs @@ -29,15 +29,6 @@ pub enum BooleanOperation { Difference, } -pub trait AsU32 { - fn as_u32(&self) -> u32; -} -impl AsU32 for u32 { - fn as_u32(&self) -> u32 { - *self - } -} - pub trait AsU64 { fn as_u64(&self) -> u64; } diff --git a/node-graph/gcore/src/vector/mod.rs b/node-graph/gcore/src/vector/mod.rs index 12869434e6..5293e88f81 100644 --- a/node-graph/gcore/src/vector/mod.rs +++ b/node-graph/gcore/src/vector/mod.rs @@ -1,12 +1,15 @@ mod algorithms; pub mod brush_stroke; +pub mod click_target; pub mod generator_nodes; pub mod misc; +mod reference_point; pub mod style; mod vector_data; mod vector_nodes; pub use bezier_rs; +pub use reference_point::*; pub use style::PathStyle; pub use vector_data::*; pub use vector_nodes::*; diff --git a/node-graph/gcore/src/vector/reference_point.rs b/node-graph/gcore/src/vector/reference_point.rs new file mode 100644 index 0000000000..7c61803283 --- /dev/null +++ b/node-graph/gcore/src/vector/reference_point.rs @@ -0,0 +1,103 @@ +use crate::math::bbox::AxisAlignedBbox; +use glam::DVec2; + +#[derive(Clone, Copy, Debug, Default, Hash, Eq, PartialEq, dyn_any::DynAny, serde::Serialize, serde::Deserialize, specta::Type)] +pub enum ReferencePoint { + #[default] + None, + TopLeft, + TopCenter, + TopRight, + CenterLeft, + Center, + CenterRight, + BottomLeft, + BottomCenter, + BottomRight, +} + +impl ReferencePoint { + pub fn point_in_bounding_box(&self, bounding_box: AxisAlignedBbox) -> Option { + let size = bounding_box.size(); + let offset = match self { + ReferencePoint::None => return None, + ReferencePoint::TopLeft => DVec2::ZERO, + ReferencePoint::TopCenter => DVec2::new(size.x / 2., 0.), + ReferencePoint::TopRight => DVec2::new(size.x, 0.), + ReferencePoint::CenterLeft => DVec2::new(0., size.y / 2.), + ReferencePoint::Center => DVec2::new(size.x / 2., size.y / 2.), + ReferencePoint::CenterRight => DVec2::new(size.x, size.y / 2.), + ReferencePoint::BottomLeft => DVec2::new(0., size.y), + ReferencePoint::BottomCenter => DVec2::new(size.x / 2., size.y), + ReferencePoint::BottomRight => DVec2::new(size.x, size.y), + }; + Some(bounding_box.start + offset) + } +} + +impl From<&str> for ReferencePoint { + fn from(input: &str) -> Self { + match input { + "None" => ReferencePoint::None, + "TopLeft" => ReferencePoint::TopLeft, + "TopCenter" => ReferencePoint::TopCenter, + "TopRight" => ReferencePoint::TopRight, + "CenterLeft" => ReferencePoint::CenterLeft, + "Center" => ReferencePoint::Center, + "CenterRight" => ReferencePoint::CenterRight, + "BottomLeft" => ReferencePoint::BottomLeft, + "BottomCenter" => ReferencePoint::BottomCenter, + "BottomRight" => ReferencePoint::BottomRight, + _ => panic!("Failed parsing unrecognized ReferencePosition enum value '{input}'"), + } + } +} + +impl From for Option { + fn from(input: ReferencePoint) -> Self { + match input { + ReferencePoint::None => None, + ReferencePoint::TopLeft => Some(DVec2::new(0., 0.)), + ReferencePoint::TopCenter => Some(DVec2::new(0.5, 0.)), + ReferencePoint::TopRight => Some(DVec2::new(1., 0.)), + ReferencePoint::CenterLeft => Some(DVec2::new(0., 0.5)), + ReferencePoint::Center => Some(DVec2::new(0.5, 0.5)), + ReferencePoint::CenterRight => Some(DVec2::new(1., 0.5)), + ReferencePoint::BottomLeft => Some(DVec2::new(0., 1.)), + ReferencePoint::BottomCenter => Some(DVec2::new(0.5, 1.)), + ReferencePoint::BottomRight => Some(DVec2::new(1., 1.)), + } + } +} + +impl From for ReferencePoint { + fn from(input: DVec2) -> Self { + const TOLERANCE: f64 = 1e-5_f64; + if input.y.abs() < TOLERANCE { + if input.x.abs() < TOLERANCE { + return ReferencePoint::TopLeft; + } else if (input.x - 0.5).abs() < TOLERANCE { + return ReferencePoint::TopCenter; + } else if (input.x - 1.).abs() < TOLERANCE { + return ReferencePoint::TopRight; + } + } else if (input.y - 0.5).abs() < TOLERANCE { + if input.x.abs() < TOLERANCE { + return ReferencePoint::CenterLeft; + } else if (input.x - 0.5).abs() < TOLERANCE { + return ReferencePoint::Center; + } else if (input.x - 1.).abs() < TOLERANCE { + return ReferencePoint::CenterRight; + } + } else if (input.y - 1.).abs() < TOLERANCE { + if input.x.abs() < TOLERANCE { + return ReferencePoint::BottomLeft; + } else if (input.x - 0.5).abs() < TOLERANCE { + return ReferencePoint::BottomCenter; + } else if (input.x - 1.).abs() < TOLERANCE { + return ReferencePoint::BottomRight; + } + } + ReferencePoint::None + } +} diff --git a/node-graph/gcore/src/vector/style.rs b/node-graph/gcore/src/vector/style.rs index 7a5783ac22..3a91651449 100644 --- a/node-graph/gcore/src/vector/style.rs +++ b/node-graph/gcore/src/vector/style.rs @@ -2,217 +2,13 @@ use crate::Color; use crate::consts::{LAYER_OUTLINE_STROKE_COLOR, LAYER_OUTLINE_STROKE_WEIGHT}; +pub use crate::gradient::*; use crate::renderer::{RenderParams, format_transform_matrix}; use dyn_any::DynAny; use glam::{DAffine2, DVec2}; use std::fmt::Write; -#[derive(Default, PartialEq, Eq, Clone, Copy, Debug, Hash, serde::Serialize, serde::Deserialize, DynAny, specta::Type, node_macro::ChoiceType)] -#[widget(Radio)] -pub enum GradientType { - #[default] - Linear, - Radial, -} - -// TODO: Someday we could switch this to a Box[T] to avoid over-allocation -// TODO: Use linear not gamma colors -/// A list of colors associated with positions (in the range 0 to 1) along a gradient. -#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize, DynAny, specta::Type)] -pub struct GradientStops(Vec<(f64, Color)>); - -impl std::hash::Hash for GradientStops { - fn hash(&self, state: &mut H) { - self.0.len().hash(state); - self.0.iter().for_each(|(position, color)| { - position.to_bits().hash(state); - color.hash(state); - }); - } -} - -impl Default for GradientStops { - fn default() -> Self { - Self(vec![(0., Color::BLACK), (1., Color::WHITE)]) - } -} - -impl IntoIterator for GradientStops { - type Item = (f64, Color); - type IntoIter = std::vec::IntoIter<(f64, Color)>; - - fn into_iter(self) -> Self::IntoIter { - self.0.into_iter() - } -} - -impl<'a> IntoIterator for &'a GradientStops { - type Item = &'a (f64, Color); - type IntoIter = std::slice::Iter<'a, (f64, Color)>; - - fn into_iter(self) -> Self::IntoIter { - self.0.iter() - } -} - -impl std::ops::Index for GradientStops { - type Output = (f64, Color); - - fn index(&self, index: usize) -> &Self::Output { - &self.0[index] - } -} - -impl std::ops::Deref for GradientStops { - type Target = Vec<(f64, Color)>; - - fn deref(&self) -> &Self::Target { - &self.0 - } -} - -impl std::ops::DerefMut for GradientStops { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.0 - } -} - -impl GradientStops { - pub fn new(stops: Vec<(f64, Color)>) -> Self { - let mut stops = Self(stops); - stops.sort(); - stops - } - - pub fn evaluate(&self, t: f64) -> Color { - if self.0.is_empty() { - return Color::BLACK; - } - - if t <= self.0[0].0 { - return self.0[0].1; - } - if t >= self.0[self.0.len() - 1].0 { - return self.0[self.0.len() - 1].1; - } - - for i in 0..self.0.len() - 1 { - let (t1, c1) = self.0[i]; - let (t2, c2) = self.0[i + 1]; - if t >= t1 && t <= t2 { - let normalized_t = (t - t1) / (t2 - t1); - return c1.lerp(&c2, normalized_t as f32); - } - } - - Color::BLACK - } - - pub fn sort(&mut self) { - self.0.sort_unstable_by(|a, b| a.0.partial_cmp(&b.0).unwrap()); - } - - pub fn reversed(&self) -> Self { - Self(self.0.iter().rev().map(|(position, color)| (1. - position, *color)).collect()) - } - - pub fn map_colors Color>(&self, f: F) -> Self { - Self(self.0.iter().map(|(position, color)| (*position, f(color))).collect()) - } -} - -/// A gradient fill. -/// -/// Contains the start and end points, along with the colors at varying points along the length. -#[repr(C)] -#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize, DynAny, specta::Type)] -pub struct Gradient { - pub stops: GradientStops, - pub gradient_type: GradientType, - pub start: DVec2, - pub end: DVec2, - pub transform: DAffine2, -} - -impl Default for Gradient { - fn default() -> Self { - Self { - stops: GradientStops::default(), - gradient_type: GradientType::Linear, - start: DVec2::new(0., 0.5), - end: DVec2::new(1., 0.5), - transform: DAffine2::IDENTITY, - } - } -} - -impl std::hash::Hash for Gradient { - fn hash(&self, state: &mut H) { - self.stops.0.len().hash(state); - [].iter() - .chain(self.start.to_array().iter()) - .chain(self.end.to_array().iter()) - .chain(self.transform.to_cols_array().iter()) - .chain(self.stops.0.iter().map(|(position, _)| position)) - .for_each(|x| x.to_bits().hash(state)); - self.stops.0.iter().for_each(|(_, color)| color.hash(state)); - self.gradient_type.hash(state); - } -} - -impl std::fmt::Display for Gradient { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let round = |x: f64| (x * 1e3).round() / 1e3; - let stops = self - .stops - .0 - .iter() - .map(|(position, color)| format!("[{}%: #{}]", round(position * 100.), color.to_rgba_hex_srgb())) - .collect::>() - .join(", "); - write!(f, "{} Gradient: {stops}", self.gradient_type) - } -} - impl Gradient { - /// Constructs a new gradient with the colors at 0 and 1 specified. - pub fn new(start: DVec2, start_color: Color, end: DVec2, end_color: Color, transform: DAffine2, gradient_type: GradientType) -> Self { - Gradient { - start, - end, - stops: GradientStops::new(vec![(0., start_color.to_gamma_srgb()), (1., end_color.to_gamma_srgb())]), - transform, - gradient_type, - } - } - - pub fn lerp(&self, other: &Self, time: f64) -> Self { - let start = self.start + (other.start - self.start) * time; - let end = self.end + (other.end - self.end) * time; - let transform = self.transform; - let stops = self - .stops - .0 - .iter() - .zip(other.stops.0.iter()) - .map(|((a_pos, a_color), (b_pos, b_color))| { - let position = a_pos + (b_pos - a_pos) * time; - let color = a_color.lerp(b_color, time as f32); - (position, color) - }) - .collect::>(); - let stops = GradientStops::new(stops); - let gradient_type = if time < 0.5 { self.gradient_type } else { other.gradient_type }; - - Self { - start, - end, - transform, - stops, - gradient_type, - } - } - /// Adds the gradient def through mutating the first argument, returning the gradient ID. fn render_defs(&self, svg_defs: &mut String, element_transform: DAffine2, stroke_transform: DAffine2, bounds: [DVec2; 2], transformed_bounds: [DVec2; 2], _render_params: &RenderParams) -> u64 { // TODO: Figure out how to use `self.transform` as part of the gradient transform, since that field (`Gradient::transform`) is currently never read from, it's only written to. @@ -268,44 +64,6 @@ impl Gradient { gradient_id } - - /// Insert a stop into the gradient, the index if successful - pub fn insert_stop(&mut self, mouse: DVec2, transform: DAffine2) -> Option { - // Transform the start and end positions to the same coordinate space as the mouse. - let (start, end) = (transform.transform_point2(self.start), transform.transform_point2(self.end)); - - // Calculate the new position by finding the closest point on the line - let new_position = ((end - start).angle_to(mouse - start)).cos() * start.distance(mouse) / start.distance(end); - - // Don't insert point past end of line - if !(0. ..=1.).contains(&new_position) { - return None; - } - - // Compute the color of the inserted stop - let get_color = |index: usize, time: f64| match (self.stops.0[index].1, self.stops.0.get(index + 1).map(|(_, c)| *c)) { - // Lerp between the nearest colors if applicable - (a, Some(b)) => a.lerp( - &b, - ((time - self.stops.0[index].0) / self.stops.0.get(index + 1).map(|end| end.0 - self.stops.0[index].0).unwrap_or_default()) as f32, - ), - // Use the start or the end color if applicable - (v, _) => v, - }; - - // Compute the correct index to keep the positions in order - let mut index = 0; - while self.stops.0.len() > index && self.stops.0[index].0 <= new_position { - index += 1; - } - - let new_color = get_color(index - 1, new_position); - - // Insert the new stop - self.stops.0.insert(index, (new_position, new_color)); - - Some(index) - } } /// Describes the fill of a layer. diff --git a/node-graph/gcore/src/vector/vector_data.rs b/node-graph/gcore/src/vector/vector_data.rs index 66b2d22fc3..6b442926f8 100644 --- a/node-graph/gcore/src/vector/vector_data.rs +++ b/node-graph/gcore/src/vector/vector_data.rs @@ -5,7 +5,7 @@ mod modification; use super::misc::{dvec2_to_point, point_to_dvec2}; use super::style::{PathStyle, Stroke}; use crate::instances::Instances; -use crate::renderer::{ClickTargetType, FreePoint}; +use crate::vector::click_target::{ClickTargetType, FreePoint}; use crate::{AlphaBlending, Color, GraphicGroupTable}; pub use attributes::*; use bezier_rs::ManipulatorGroup; diff --git a/node-graph/gstd/src/brush.rs b/node-graph/gstd/src/brush.rs index ed4cbb1685..58a215a0cd 100644 --- a/node-graph/gstd/src/brush.rs +++ b/node-graph/gstd/src/brush.rs @@ -3,8 +3,8 @@ use glam::{DAffine2, DVec2}; use graph_craft::generic::FnNode; use graph_craft::proto::FutureWrapperNode; use graphene_core::instances::Instance; +use graphene_core::math::bbox::{AxisAlignedBbox, Bbox}; use graphene_core::raster::adjustments::blend_colors; -use graphene_core::raster::bbox::{AxisAlignedBbox, Bbox}; use graphene_core::raster::brush_cache::BrushCache; use graphene_core::raster::image::Image; use graphene_core::raster::{Alpha, BitmapMut, BlendMode, Color, Pixel, Sample}; diff --git a/node-graph/gstd/src/raster.rs b/node-graph/gstd/src/raster.rs index a3dfc77076..146d4d1dcf 100644 --- a/node-graph/gstd/src/raster.rs +++ b/node-graph/gstd/src/raster.rs @@ -2,11 +2,11 @@ use dyn_any::DynAny; use fastnoise_lite; use glam::{DAffine2, DVec2, Vec2}; use graphene_core::instances::Instance; -use graphene_core::raster::bbox::Bbox; +use graphene_core::math::bbox::Bbox; pub use graphene_core::raster::*; use graphene_core::raster_types::{CPU, Raster, RasterDataTable}; use graphene_core::transform::Transform; -use graphene_core::{AlphaBlending, Ctx, ExtractFootprint}; +use graphene_core::{Ctx, ExtractFootprint}; use rand::prelude::*; use rand_chacha::ChaCha8Rng; use std::fmt::Debug; diff --git a/node-graph/gstd/src/wasm_application_io.rs b/node-graph/gstd/src/wasm_application_io.rs index 6c8f52cc45..5cd7b4f9ff 100644 --- a/node-graph/gstd/src/wasm_application_io.rs +++ b/node-graph/gstd/src/wasm_application_io.rs @@ -5,7 +5,7 @@ use graphene_application_io::{ApplicationIo, ExportFormat, RenderConfig}; #[cfg(target_arch = "wasm32")] use graphene_core::instances::Instances; #[cfg(target_arch = "wasm32")] -use graphene_core::raster::bbox::Bbox; +use graphene_core::math::bbox::Bbox; use graphene_core::raster::image::Image; use graphene_core::raster_types::{CPU, Raster, RasterDataTable}; use graphene_core::renderer::RenderMetadata; diff --git a/node-graph/interpreted-executor/src/node_registry.rs b/node-graph/interpreted-executor/src/node_registry.rs index 4f45992c20..838f99852f 100644 --- a/node-graph/interpreted-executor/src/node_registry.rs +++ b/node-graph/interpreted-executor/src/node_registry.rs @@ -12,14 +12,20 @@ use graphene_core::{NodeIO, NodeIOTypes}; use graphene_core::{fn_type_fut, future}; use graphene_std::Context; use graphene_std::GraphicElement; -use graphene_std::any::{ComposeTypeErased, DowncastBothNode, DynAnyNode, IntoTypeErasedNode}; +#[cfg(feature = "gpu")] +use graphene_std::any::DowncastBothNode; +use graphene_std::any::{ComposeTypeErased, DynAnyNode, IntoTypeErasedNode}; use graphene_std::application_io::{ImageTexture, SurfaceFrame}; -use graphene_std::wasm_application_io::*; +#[cfg(feature = "gpu")] +use graphene_std::wasm_application_io::{WasmEditorApi, WasmSurfaceHandle}; use node_registry_macros::{async_node, convert_node, into_node}; use once_cell::sync::Lazy; use std::collections::HashMap; +#[cfg(feature = "gpu")] use std::sync::Arc; -use wgpu_executor::{WgpuExecutor, WgpuSurface, WindowHandle}; +#[cfg(feature = "gpu")] +use wgpu_executor::WgpuExecutor; +use wgpu_executor::{WgpuSurface, WindowHandle}; // TODO: turn into hashmap fn node_registry() -> HashMap> { diff --git a/node-graph/node-macro/src/derive_choice_type.rs b/node-graph/node-macro/src/derive_choice_type.rs index 14df0f246f..380b0409dc 100644 --- a/node-graph/node-macro/src/derive_choice_type.rs +++ b/node-graph/node-macro/src/derive_choice_type.rs @@ -168,7 +168,7 @@ fn derive_enum(enum_attributes: &[Attribute], name: Ident, input: syn::DataEnum) WidgetHint::Dropdown => quote! { Dropdown }, }; Ok(quote! { - impl #crate_name::vector::misc::AsU32 for #name { + impl #crate_name::AsU32 for #name { fn as_u32(&self) -> u32 { *self as u32 } From d581319ee8272db06d4cd029acf09682f813b399 Mon Sep 17 00:00:00 2001 From: Firestar99 Date: Fri, 27 Jun 2025 12:30:12 +0200 Subject: [PATCH 28/44] Prep `gcore` splitup 2: Vector extension traits (#2759) * extension trait for `MergeByDistance::merge_by_distance_*` * extension trait for `VectorData::append_bezpath` * extension trait for `HandleId::set_relative_position` * remove unreferenced rust files --- .../document/utility_types/transformation.rs | 2 +- .../tool/common_functionality/shape_editor.rs | 2 +- .../common_functionality/utility_functions.rs | 2 +- .../messages/tool/tool_messages/path_tool.rs | 2 +- .../gcore/src/raster/image/base64_serde.rs | 0 .../vector/algorithms/merge_by_distance.rs | 11 ++-- node-graph/gcore/src/vector/algorithms/mod.rs | 6 +-- node-graph/gcore/src/vector/mod.rs | 2 +- node-graph/gcore/src/vector/vector_data.rs | 15 ------ .../src/vector/vector_data/modification.rs | 27 ++++++++++ node-graph/gcore/src/vector/vector_nodes.rs | 3 +- node-graph/gstd/src/cache.rs | 51 ------------------- node-graph/gstd/src/value.rs | 45 ---------------- node-graph/gstd/src/vector.rs | 1 + 14 files changed, 46 insertions(+), 123 deletions(-) delete mode 100644 node-graph/gcore/src/raster/image/base64_serde.rs delete mode 100644 node-graph/gstd/src/cache.rs delete mode 100644 node-graph/gstd/src/value.rs diff --git a/editor/src/messages/portfolio/document/utility_types/transformation.rs b/editor/src/messages/portfolio/document/utility_types/transformation.rs index 4970433e7a..a8aff38058 100644 --- a/editor/src/messages/portfolio/document/utility_types/transformation.rs +++ b/editor/src/messages/portfolio/document/utility_types/transformation.rs @@ -9,8 +9,8 @@ use crate::messages::tool::common_functionality::shape_editor::ShapeState; use crate::messages::tool::utility_types::ToolType; use glam::{DAffine2, DMat2, DVec2}; use graphene_std::renderer::Quad; -use graphene_std::vector::ManipulatorPointId; use graphene_std::vector::VectorModificationType; +use graphene_std::vector::{HandleExt, ManipulatorPointId}; use graphene_std::vector::{HandleId, PointId}; use std::collections::{HashMap, VecDeque}; use std::f64::consts::PI; diff --git a/editor/src/messages/tool/common_functionality/shape_editor.rs b/editor/src/messages/tool/common_functionality/shape_editor.rs index 218c53c6c2..c1f7e99f08 100644 --- a/editor/src/messages/tool/common_functionality/shape_editor.rs +++ b/editor/src/messages/tool/common_functionality/shape_editor.rs @@ -12,7 +12,7 @@ use crate::messages::tool::common_functionality::utility_functions::is_visible_p use crate::messages::tool::tool_messages::path_tool::{PathOverlayMode, PointSelectState}; use bezier_rs::{Bezier, BezierHandles, Subpath, TValue}; use glam::{DAffine2, DVec2}; -use graphene_std::vector::{HandleId, SegmentId}; +use graphene_std::vector::{HandleExt, HandleId, SegmentId}; use graphene_std::vector::{ManipulatorPointId, PointId, VectorData, VectorModificationType}; #[derive(Debug, Copy, Clone, PartialEq, Eq)] diff --git a/editor/src/messages/tool/common_functionality/utility_functions.rs b/editor/src/messages/tool/common_functionality/utility_functions.rs index c6974d5009..abe84224a1 100644 --- a/editor/src/messages/tool/common_functionality/utility_functions.rs +++ b/editor/src/messages/tool/common_functionality/utility_functions.rs @@ -12,7 +12,7 @@ use bezier_rs::Bezier; use glam::{DAffine2, DVec2}; use graphene_std::renderer::Quad; use graphene_std::text::{FontCache, load_face}; -use graphene_std::vector::{HandleId, ManipulatorPointId, PointId, SegmentId, VectorData, VectorModificationType}; +use graphene_std::vector::{HandleExt, HandleId, ManipulatorPointId, PointId, SegmentId, VectorData, VectorModificationType}; /// Determines if a path should be extended. Goal in viewport space. Returns the path and if it is extending from the start, if applicable. pub fn should_extend( diff --git a/editor/src/messages/tool/tool_messages/path_tool.rs b/editor/src/messages/tool/tool_messages/path_tool.rs index 395d6a432c..51c1fa579d 100644 --- a/editor/src/messages/tool/tool_messages/path_tool.rs +++ b/editor/src/messages/tool/tool_messages/path_tool.rs @@ -18,7 +18,7 @@ use crate::messages::tool::common_functionality::snapping::{SnapCache, SnapCandi use crate::messages::tool::common_functionality::utility_functions::{calculate_segment_angle, find_two_param_best_approximate}; use bezier_rs::{Bezier, TValue}; use graphene_std::renderer::Quad; -use graphene_std::vector::{HandleId, NoHashBuilder, SegmentId, VectorData}; +use graphene_std::vector::{HandleExt, HandleId, NoHashBuilder, SegmentId, VectorData}; use graphene_std::vector::{ManipulatorPointId, PointId, VectorModificationType}; use std::vec; diff --git a/node-graph/gcore/src/raster/image/base64_serde.rs b/node-graph/gcore/src/raster/image/base64_serde.rs deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/node-graph/gcore/src/vector/algorithms/merge_by_distance.rs b/node-graph/gcore/src/vector/algorithms/merge_by_distance.rs index 4d598f5fd5..7cd5adc4c5 100644 --- a/node-graph/gcore/src/vector/algorithms/merge_by_distance.rs +++ b/node-graph/gcore/src/vector/algorithms/merge_by_distance.rs @@ -3,9 +3,14 @@ use glam::{DAffine2, DVec2}; use petgraph::prelude::UnGraphMap; use rustc_hash::FxHashSet; -impl VectorData { +pub trait MergeByDistanceExt { /// Collapse all points with edges shorter than the specified distance - pub fn merge_by_distance_topological(&mut self, distance: f64) { + fn merge_by_distance_topological(&mut self, distance: f64); + fn merge_by_distance_spatial(&mut self, transform: DAffine2, distance: f64); +} + +impl MergeByDistanceExt for VectorData { + fn merge_by_distance_topological(&mut self, distance: f64) { // Treat self as an undirected graph let indices = VectorDataIndex::build_from(self); @@ -95,7 +100,7 @@ impl VectorData { self.point_domain.retain(&mut self.segment_domain, |id| !points_to_delete.contains(id)); } - pub fn merge_by_distance_spatial(&mut self, transform: DAffine2, distance: f64) { + fn merge_by_distance_spatial(&mut self, transform: DAffine2, distance: f64) { let point_count = self.point_domain.positions().len(); // Find min x and y for grid cell normalization diff --git a/node-graph/gcore/src/vector/algorithms/mod.rs b/node-graph/gcore/src/vector/algorithms/mod.rs index 40b76fcd4f..ed44f25590 100644 --- a/node-graph/gcore/src/vector/algorithms/mod.rs +++ b/node-graph/gcore/src/vector/algorithms/mod.rs @@ -1,6 +1,6 @@ pub mod bezpath_algorithms; -mod instance; -mod merge_by_distance; +pub mod instance; +pub mod merge_by_distance; pub mod offset_subpath; -mod poisson_disk; +pub mod poisson_disk; pub mod spline; diff --git a/node-graph/gcore/src/vector/mod.rs b/node-graph/gcore/src/vector/mod.rs index 5293e88f81..e54620307a 100644 --- a/node-graph/gcore/src/vector/mod.rs +++ b/node-graph/gcore/src/vector/mod.rs @@ -1,4 +1,4 @@ -mod algorithms; +pub mod algorithms; pub mod brush_stroke; pub mod click_target; pub mod generator_nodes; diff --git a/node-graph/gcore/src/vector/vector_data.rs b/node-graph/gcore/src/vector/vector_data.rs index 6b442926f8..7a596058d5 100644 --- a/node-graph/gcore/src/vector/vector_data.rs +++ b/node-graph/gcore/src/vector/vector_data.rs @@ -186,11 +186,6 @@ impl VectorData { self.point_domain.push(id, point.position); } - /// Appends a Kurbo BezPath to the vector data. - pub fn append_bezpath(&mut self, bezpath: kurbo::BezPath) { - AppendBezpath::append_bezpath(self, bezpath); - } - /// Construct some new vector data from a single subpath with an identity transform and black fill. pub fn from_subpath(subpath: impl Borrow>) -> Self { Self::from_subpaths([subpath], false) @@ -637,16 +632,6 @@ impl HandleId { handle_position.map(|pos| (pos - anchor_position).length()).unwrap_or(f64::MAX) } - /// Set the handle's position relative to the anchor which is the start anchor for the primary handle and end anchor for the end handle. - #[must_use] - pub fn set_relative_position(self, relative_position: DVec2) -> VectorModificationType { - let Self { ty, segment } = self; - match ty { - HandleType::Primary => VectorModificationType::SetPrimaryHandle { segment, relative_position }, - HandleType::End => VectorModificationType::SetEndHandle { segment, relative_position }, - } - } - /// Convert an end handle to the primary handle and a primary handle to an end handle. Note that the new handle may not exist (e.g. for a quadratic bézier). #[must_use] pub fn opposite(self) -> Self { diff --git a/node-graph/gcore/src/vector/vector_data/modification.rs b/node-graph/gcore/src/vector/vector_data/modification.rs index 15ed28b638..0f06c643a2 100644 --- a/node-graph/gcore/src/vector/vector_data/modification.rs +++ b/node-graph/gcore/src/vector/vector_data/modification.rs @@ -634,6 +634,33 @@ impl<'a> AppendBezpath<'a> { } } +pub trait VectorDataExt { + /// Appends a Kurbo BezPath to the vector data. + fn append_bezpath(&mut self, bezpath: BezPath); +} + +impl VectorDataExt for VectorData { + fn append_bezpath(&mut self, bezpath: BezPath) { + AppendBezpath::append_bezpath(self, bezpath); + } +} + +pub trait HandleExt { + /// Set the handle's position relative to the anchor which is the start anchor for the primary handle and end anchor for the end handle. + #[must_use] + fn set_relative_position(self, relative_position: DVec2) -> VectorModificationType; +} + +impl HandleExt for HandleId { + fn set_relative_position(self, relative_position: DVec2) -> VectorModificationType { + let Self { ty, segment } = self; + match ty { + HandleType::Primary => VectorModificationType::SetPrimaryHandle { segment, relative_position }, + HandleType::End => VectorModificationType::SetEndHandle { segment, relative_position }, + } + } +} + #[cfg(test)] mod tests { use super::*; diff --git a/node-graph/gcore/src/vector/vector_nodes.rs b/node-graph/gcore/src/vector/vector_nodes.rs index c2c3fdbd36..877e2bc4ff 100644 --- a/node-graph/gcore/src/vector/vector_nodes.rs +++ b/node-graph/gcore/src/vector/vector_nodes.rs @@ -3,12 +3,13 @@ use super::algorithms::offset_subpath::offset_subpath; use super::algorithms::spline::{solve_spline_first_handle_closed, solve_spline_first_handle_open}; use super::misc::{CentroidType, point_to_dvec2}; use super::style::{Fill, Gradient, GradientStops, Stroke}; -use super::{PointId, SegmentDomain, SegmentId, StrokeId, VectorData, VectorDataTable}; +use super::{PointId, SegmentDomain, SegmentId, StrokeId, VectorData, VectorDataExt, VectorDataTable}; use crate::instances::{Instance, InstanceMut, Instances}; use crate::raster_types::{CPU, GPU, RasterDataTable}; use crate::registry::types::{Angle, Fraction, IntegerCount, Length, Multiplier, Percentage, PixelLength, PixelSize, SeedValue}; use crate::renderer::GraphicElementRendered; use crate::transform::{Footprint, ReferencePoint, Transform}; +use crate::vector::algorithms::merge_by_distance::MergeByDistanceExt; use crate::vector::misc::{MergeByDistanceAlgorithm, PointSpacingType}; use crate::vector::style::{PaintOrder, StrokeAlign, StrokeCap, StrokeJoin}; use crate::vector::{FillId, PointDomain, RegionId}; diff --git a/node-graph/gstd/src/cache.rs b/node-graph/gstd/src/cache.rs deleted file mode 100644 index 2a3bbe27d4..0000000000 --- a/node-graph/gstd/src/cache.rs +++ /dev/null @@ -1,51 +0,0 @@ -use parking_lot::RawRwLock; -use std::any::Any; -use std::borrow::Borrow; -use std::cell::RefCell; -use std::collections::hash_map::DefaultHasher; -use std::collections::HashMap; -use std::hash::{Hash, Hasher}; -use std::iter::{self, Sum}; -use std::marker::PhantomData; -use storage_map::{StorageMap, StorageMapGuard}; - -/// Caches the output of a given Node and acts as a proxy -/// Automatically resets if it receives different input -pub struct SmartCacheNode<'n, 'c, NODE: Node + 'c> { - node: &'n NODE, - map: StorageMap>>, -} -impl<'n: 'c, 'c, NODE: Node + 'c> Node for SmartCacheNode<'n, 'c, NODE> -where - for<'a> NODE::Input<'a>: Hash, -{ - type Input<'a> - = NODE::Input<'a> - where - Self: 'a, - 'c: 'a; - type Output<'a> - = StorageMapGuard<'a, RawRwLock, CacheNode<'n, 'c, NODE>> - where - Self: 'a, - 'c: 'a; - fn eval<'a, I: Borrow>>(&'a self, input: I) -> Self::Output<'a> { - let mut hasher = DefaultHasher::new(); - input.borrow().hash(&mut hasher); - let hash = hasher.finish(); - - self.map.get_or_create_with(&hash, || { - trace!("Creating new cache node"); - CacheNode::new(self.node) - }) - } -} - -impl<'n, 'c, NODE: Node> SmartCacheNode<'n, 'c, NODE> { - pub fn clear(&'n mut self) { - self.map = StorageMap::default(); - } - pub fn new(node: &'n NODE) -> SmartCacheNode<'n, 'c, NODE> { - SmartCacheNode { node, map: StorageMap::default() } - } -} diff --git a/node-graph/gstd/src/value.rs b/node-graph/gstd/src/value.rs deleted file mode 100644 index 8fdf5f34e9..0000000000 --- a/node-graph/gstd/src/value.rs +++ /dev/null @@ -1,45 +0,0 @@ -use core::marker::PhantomData; -pub use graphene_core::value::*; -use graphene_core::Node; -use dyn_any::DynAny; - -pub struct AnyRefNode<'n, N: Node<'n>>(N, PhantomData<&'n ()>); - -impl<'n, N: Node<'n, Output = &'n O>, O: DynAny<'n> + 'n> Node<'n> for AnyRefNode<'n, N> { - fn eval(&'n self) -> &'n (dyn DynAny<'n>) { - let value: &O = self.0.eval(); - value - } -} -impl<'n, N: Node<'n, Output = &'n O>, O: 'n + ?Sized> AnyRefNode<'n, N> { - pub fn new(n: N) -> AnyRefNode<'n, N> { - AnyRefNode(n, PhantomData) - } -} - -pub struct StorageNode<'n>(&'n dyn Node<'n, Output = &'n dyn DynAny<'n>>); - -impl<'n> Node<'n> for StorageNode<'n> { - fn eval(&'n self) -> &'n (dyn DynAny<'n>) { - self.0.eval() - } -} -impl<'n> StorageNode<'n> { - pub fn new>>(n: &'n N) -> StorageNode<'n> { - StorageNode(n) - } -} - -#[derive(Default)] -pub struct AnyValueNode<'n, T>(T, PhantomData<&'n ()>); -impl<'n, T: 'n + DynAny<'n>> Node<'n> for AnyValueNode<'n, T> { - fn eval(&'n self) -> &'n dyn DynAny<'n> { - &self.0 - } -} - -impl<'n, T> AnyValueNode<'n, T> { - pub const fn new(value: T) -> AnyValueNode<'n, T> { - AnyValueNode(value, PhantomData) - } -} diff --git a/node-graph/gstd/src/vector.rs b/node-graph/gstd/src/vector.rs index 8b82d23dd6..754f62df76 100644 --- a/node-graph/gstd/src/vector.rs +++ b/node-graph/gstd/src/vector.rs @@ -1,6 +1,7 @@ use bezier_rs::{ManipulatorGroup, Subpath}; use glam::{DAffine2, DVec2}; use graphene_core::instances::{Instance, InstanceRef}; +use graphene_core::vector::algorithms::merge_by_distance::MergeByDistanceExt; use graphene_core::vector::misc::BooleanOperation; use graphene_core::vector::style::Fill; pub use graphene_core::vector::*; From 9cf8d2cd053f14ddc19a26fee7e45e988f63e0fe Mon Sep 17 00:00:00 2001 From: Firestar99 Date: Fri, 27 Jun 2025 14:40:54 +0200 Subject: [PATCH 29/44] Run CI for non master branches (#2763) * ci: run CI on PRs not targeting master * fix warnings when compiling tests --- .github/workflows/build-dev-and-ci.yml | 2 -- .github/workflows/comment-clippy-warnings.yaml | 1 - .github/workflows/comment-profiling-changes.yaml | 1 - .github/workflows/library-rawkit.yml | 2 -- .github/workflows/website.yml | 2 -- editor/src/node_graph_executor/runtime.rs | 5 +++-- 6 files changed, 3 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build-dev-and-ci.yml b/.github/workflows/build-dev-and-ci.yml index 77fd22d2a9..ff3f25151e 100644 --- a/.github/workflows/build-dev-and-ci.yml +++ b/.github/workflows/build-dev-and-ci.yml @@ -5,8 +5,6 @@ on: branches: - master pull_request: - branches: - - master env: CARGO_TERM_COLOR: always INDEX_HTML_HEAD_REPLACEMENT: diff --git a/.github/workflows/comment-clippy-warnings.yaml b/.github/workflows/comment-clippy-warnings.yaml index 07acaaea25..1c02e88f0c 100644 --- a/.github/workflows/comment-clippy-warnings.yaml +++ b/.github/workflows/comment-clippy-warnings.yaml @@ -2,7 +2,6 @@ name: Clippy Check on: pull_request: - branches: [master] types: [opened, reopened, synchronize, ready_for_review] jobs: diff --git a/.github/workflows/comment-profiling-changes.yaml b/.github/workflows/comment-profiling-changes.yaml index d130fdc557..d83e6d67e4 100644 --- a/.github/workflows/comment-profiling-changes.yaml +++ b/.github/workflows/comment-profiling-changes.yaml @@ -2,7 +2,6 @@ name: Profiling Changes on: pull_request: - branches: [master] env: CARGO_TERM_COLOR: always diff --git a/.github/workflows/library-rawkit.yml b/.github/workflows/library-rawkit.yml index 3d286c9a91..b7b4bb3153 100644 --- a/.github/workflows/library-rawkit.yml +++ b/.github/workflows/library-rawkit.yml @@ -7,8 +7,6 @@ on: paths: - "libraries/rawkit/**" pull_request: - branches: - - master paths: - "libraries/rawkit/**" diff --git a/.github/workflows/website.yml b/.github/workflows/website.yml index c137b57997..0451d4226e 100644 --- a/.github/workflows/website.yml +++ b/.github/workflows/website.yml @@ -7,8 +7,6 @@ on: paths: - website/** pull_request: - branches: - - master paths: - website/** env: diff --git a/editor/src/node_graph_executor/runtime.rs b/editor/src/node_graph_executor/runtime.rs index c949e32dd0..40ca633f09 100644 --- a/editor/src/node_graph_executor/runtime.rs +++ b/editor/src/node_graph_executor/runtime.rs @@ -227,8 +227,9 @@ impl NodeRuntime { } async fn update_network(&mut self, mut graph: NodeNetwork) -> Result { - #[cfg(not(test))] - preprocessor::expand_network(&mut graph, &self.substitutions); + if cfg!(not(test)) { + preprocessor::expand_network(&mut graph, &self.substitutions); + } let scoped_network = wrap_network_in_scope(graph, self.editor_api.clone()); From ffc6c5532bf3d531df4a72531acac92514b3bdb7 Mon Sep 17 00:00:00 2001 From: Firestar99 Date: Fri, 27 Jun 2025 15:12:08 +0200 Subject: [PATCH 30/44] Extract `gpath_bool` from `mod gstd::ops` path_bool-related nodes (#2762) * cargo shear * Extract `gpath_bool` from `mod gstd::ops` path_bool-related nodes --- Cargo.lock | 30 +++++---- Cargo.toml | 3 + .../document/document_message_handler.rs | 5 +- .../graph_operation_message.rs | 2 +- .../graph_operation_message_handler.rs | 2 +- .../document/graph_operation/utility_types.rs | 2 +- .../node_graph/document_node_definitions.rs | 4 +- .../document/node_graph/node_properties.rs | 3 +- .../portfolio/document/utility_types/misc.rs | 2 +- .../messages/portfolio/document_migration.rs | 1 + .../menu_bar/menu_bar_message_handler.rs | 2 +- .../tool/tool_messages/select_tool.rs | 2 +- frontend/wasm/Cargo.toml | 1 - .../gcore/src/graphic_element/renderer.rs | 2 + .../renderer/convert_usvg_path.rs | 47 ++++++++++++++ node-graph/gcore/src/vector/misc.rs | 16 ----- node-graph/gpath-bool/Cargo.toml | 19 ++++++ .../src/vector.rs => gpath-bool/src/lib.rs} | 64 ++++++------------- node-graph/graph-craft/Cargo.toml | 1 + node-graph/graph-craft/src/document/value.rs | 2 +- node-graph/gstd/Cargo.toml | 4 +- node-graph/gstd/src/lib.rs | 3 +- node-graph/interpreted-executor/Cargo.toml | 1 + .../interpreted-executor/src/node_registry.rs | 2 +- node-graph/preprocessor/Cargo.toml | 15 ----- 25 files changed, 128 insertions(+), 107 deletions(-) create mode 100644 node-graph/gcore/src/graphic_element/renderer/convert_usvg_path.rs create mode 100644 node-graph/gpath-bool/Cargo.toml rename node-graph/{gstd/src/vector.rs => gpath-bool/src/lib.rs} (89%) diff --git a/Cargo.lock b/Cargo.lock index cc89fe8b23..71b2b6c4c0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2132,6 +2132,7 @@ dependencies = [ "graph-craft", "graphene-application-io", "graphene-core", + "graphene-path-bool", "iai-callgrind", "js-sys", "log", @@ -2214,12 +2215,26 @@ dependencies = [ "wgpu", ] +[[package]] +name = "graphene-path-bool" +version = "0.1.0" +dependencies = [ + "bezier-rs", + "dyn-any", + "glam", + "graphene-core", + "log", + "node-macro", + "path-bool", + "serde", + "specta", +] + [[package]] name = "graphene-std" version = "0.1.0" dependencies = [ "base64 0.22.1", - "bezier-rs", "bytemuck", "dyn-any", "fastnoise-lite", @@ -2228,16 +2243,15 @@ dependencies = [ "graph-craft", "graphene-application-io", "graphene-core", + "graphene-path-bool", "image", "log", "ndarray", "node-macro", - "path-bool", "rand 0.9.0", "rand_chacha 0.9.0", "reqwest", "tokio", - "usvg", "vello", "wasm-bindgen", "wasm-bindgen-futures", @@ -2313,7 +2327,6 @@ dependencies = [ name = "graphite-wasm" version = "0.0.0" dependencies = [ - "glam", "graph-craft", "graphene-std", "graphite-editor", @@ -2948,6 +2961,7 @@ dependencies = [ "glam", "graph-craft", "graphene-core", + "graphene-path-bool", "graphene-std", "log", "once_cell", @@ -4481,17 +4495,9 @@ checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" name = "preprocessor" version = "0.1.0" dependencies = [ - "base64 0.22.1", - "dyn-any", - "futures", - "glam", "graph-craft", "graphene-std", "interpreted-executor", - "log", - "serde", - "serde_json", - "tokio", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index cb81f0d147..bcdd4569c9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,7 @@ members = [ "node-graph/gapplication-io", "node-graph/gcore", "node-graph/gstd", + "node-graph/gpath-bool", "node-graph/graph-craft", "node-graph/graphene-cli", "node-graph/interpreted-executor", @@ -23,6 +24,7 @@ default-members = [ "frontend/wasm", "node-graph/gcore", "node-graph/gstd", + "node-graph/gpath-bool", "node-graph/graph-craft", "node-graph/graphene-cli", "node-graph/interpreted-executor", @@ -39,6 +41,7 @@ math-parser = { path = "libraries/math-parser" } path-bool = { path = "libraries/path-bool" } graphene-application-io = { path = "node-graph/gapplication-io" } graphene-core = { path = "node-graph/gcore" } +graphene-path-bool = { path = "node-graph/gpath-bool" } graph-craft = { path = "node-graph/graph-craft" } graphene-std = { path = "node-graph/gstd" } interpreted-executor = { path = "node-graph/interpreted-executor" } diff --git a/editor/src/messages/portfolio/document/document_message_handler.rs b/editor/src/messages/portfolio/document/document_message_handler.rs index 9b316e07b0..41938131cf 100644 --- a/editor/src/messages/portfolio/document/document_message_handler.rs +++ b/editor/src/messages/portfolio/document/document_message_handler.rs @@ -30,11 +30,12 @@ use glam::{DAffine2, DVec2, IVec2}; use graph_craft::document::value::TaggedValue; use graph_craft::document::{NodeId, NodeInput, NodeNetwork, OldNodeNetwork}; use graphene_std::math::quad::Quad; +use graphene_std::path_bool::{boolean_intersect, path_bool_lib}; use graphene_std::raster::BlendMode; use graphene_std::raster_types::{Raster, RasterDataTable}; +use graphene_std::vector::PointId; use graphene_std::vector::click_target::{ClickTarget, ClickTargetType}; use graphene_std::vector::style::ViewMode; -use graphene_std::vector::{PointId, path_bool_lib}; use std::time::Duration; pub struct DocumentMessageData<'a> { @@ -2962,7 +2963,7 @@ impl<'a> ClickXRayIter<'a> { // We do this on this using the target area to reduce computation (as the target area is usually very simple). if clip && intersects { let clip_path = click_targets_to_path_lib_segments(click_targets.iter().flat_map(|x| x.iter()), transform); - let subtracted = graphene_std::vector::boolean_intersect(path, clip_path).into_iter().flatten().collect::>(); + let subtracted = boolean_intersect(path, clip_path).into_iter().flatten().collect::>(); if subtracted.is_empty() { use_children = false; } else { diff --git a/editor/src/messages/portfolio/document/graph_operation/graph_operation_message.rs b/editor/src/messages/portfolio/document/graph_operation/graph_operation_message.rs index 7aa1bd775d..db4fe37327 100644 --- a/editor/src/messages/portfolio/document/graph_operation/graph_operation_message.rs +++ b/editor/src/messages/portfolio/document/graph_operation/graph_operation_message.rs @@ -79,7 +79,7 @@ pub enum GraphOperationMessage { }, NewBooleanOperationLayer { id: NodeId, - operation: graphene_std::vector::misc::BooleanOperation, + operation: graphene_std::path_bool::BooleanOperation, parent: LayerNodeIdentifier, insert_index: usize, }, diff --git a/editor/src/messages/portfolio/document/graph_operation/graph_operation_message_handler.rs b/editor/src/messages/portfolio/document/graph_operation/graph_operation_message_handler.rs index 8600555dae..375ae5ef0f 100644 --- a/editor/src/messages/portfolio/document/graph_operation/graph_operation_message_handler.rs +++ b/editor/src/messages/portfolio/document/graph_operation/graph_operation_message_handler.rs @@ -10,8 +10,8 @@ use glam::{DAffine2, DVec2, IVec2}; use graph_craft::document::{NodeId, NodeInput}; use graphene_std::Color; use graphene_std::renderer::Quad; +use graphene_std::renderer::convert_usvg_path::convert_usvg_path; use graphene_std::text::{Font, TypesettingConfig}; -use graphene_std::vector::convert_usvg_path; use graphene_std::vector::style::{Fill, Gradient, GradientStops, GradientType, PaintOrder, Stroke, StrokeAlign, StrokeCap, StrokeJoin}; #[derive(Debug, Clone)] diff --git a/editor/src/messages/portfolio/document/graph_operation/utility_types.rs b/editor/src/messages/portfolio/document/graph_operation/utility_types.rs index 56b94ef76e..d79a60b81d 100644 --- a/editor/src/messages/portfolio/document/graph_operation/utility_types.rs +++ b/editor/src/messages/portfolio/document/graph_operation/utility_types.rs @@ -134,7 +134,7 @@ impl<'a> ModifyInputsContext<'a> { LayerNodeIdentifier::new(new_id, self.network_interface, &[]) } - pub fn insert_boolean_data(&mut self, operation: graphene_std::vector::misc::BooleanOperation, layer: LayerNodeIdentifier) { + pub fn insert_boolean_data(&mut self, operation: graphene_std::path_bool::BooleanOperation, layer: LayerNodeIdentifier) { let boolean = resolve_document_node_type("Boolean Operation").expect("Boolean node does not exist").node_template_input_override([ Some(NodeInput::value(TaggedValue::GraphicGroup(graphene_std::GraphicGroupTable::default()), true)), Some(NodeInput::value(TaggedValue::BooleanOperation(operation), false)), diff --git a/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs b/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs index 98ae6c413a..c6276e4109 100644 --- a/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs +++ b/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs @@ -1734,7 +1734,7 @@ fn static_nodes() -> Vec { nodes: vec![ DocumentNode { inputs: vec![NodeInput::network(concrete!(VectorDataTable), 0), NodeInput::network(concrete!(vector::style::Fill), 1)], - implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_std::vector::BooleanOperationNode")), + implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_path_bool::BooleanOperationNode")), manual_composition: Some(generic!(T)), ..Default::default() }, @@ -1765,7 +1765,7 @@ fn static_nodes() -> Vec { }), inputs: vec![ NodeInput::value(TaggedValue::GraphicGroup(GraphicGroupTable::default()), true), - NodeInput::value(TaggedValue::BooleanOperation(vector::misc::BooleanOperation::Union), false), + NodeInput::value(TaggedValue::BooleanOperation(path_bool::BooleanOperation::Union), false), ], ..Default::default() }, diff --git a/editor/src/messages/portfolio/document/node_graph/node_properties.rs b/editor/src/messages/portfolio/document/node_graph/node_properties.rs index 226931dde0..44b91fc4ce 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_properties.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_properties.rs @@ -13,6 +13,7 @@ use graph_craft::document::value::TaggedValue; use graph_craft::document::{DocumentNode, DocumentNodeImplementation, NodeId, NodeInput}; use graphene_std::animation::RealTimeMode; use graphene_std::ops::XY; +use graphene_std::path_bool::BooleanOperation; use graphene_std::raster::curve::Curve; use graphene_std::raster::{ BlendMode, CellularDistanceFunction, CellularReturnType, Color, DomainWarpType, FractalType, LuminanceCalculation, NoiseType, RedGreenBlue, RedGreenBlueAlpha, RelativeAbsolute, @@ -22,8 +23,8 @@ use graphene_std::raster_types::{CPU, GPU, RasterDataTable}; use graphene_std::text::Font; use graphene_std::transform::{Footprint, ReferencePoint}; use graphene_std::vector::VectorDataTable; +use graphene_std::vector::misc::GridType; use graphene_std::vector::misc::{ArcType, MergeByDistanceAlgorithm}; -use graphene_std::vector::misc::{BooleanOperation, GridType}; use graphene_std::vector::misc::{CentroidType, PointSpacingType}; use graphene_std::vector::style::{Fill, FillChoice, FillType, GradientStops}; use graphene_std::vector::style::{GradientType, PaintOrder, StrokeAlign, StrokeCap, StrokeJoin}; diff --git a/editor/src/messages/portfolio/document/utility_types/misc.rs b/editor/src/messages/portfolio/document/utility_types/misc.rs index de350242e9..ae8fd73532 100644 --- a/editor/src/messages/portfolio/document/utility_types/misc.rs +++ b/editor/src/messages/portfolio/document/utility_types/misc.rs @@ -693,5 +693,5 @@ impl PTZ { #[derive(Clone, Copy, Debug, PartialEq, serde::Serialize, serde::Deserialize)] pub enum GroupFolderType { Layer, - BooleanOperation(graphene_std::vector::misc::BooleanOperation), + BooleanOperation(graphene_std::path_bool::BooleanOperation), } diff --git a/editor/src/messages/portfolio/document_migration.rs b/editor/src/messages/portfolio/document_migration.rs index 3d9c7d240c..867d38da18 100644 --- a/editor/src/messages/portfolio/document_migration.rs +++ b/editor/src/messages/portfolio/document_migration.rs @@ -70,6 +70,7 @@ const REPLACEMENTS: &[(&str, &str)] = &[ ("graphene_core::transform::CullNode", "graphene_core::ops::IdentityNode"), ("graphene_std::raster::MaskImageNode", "graphene_std::raster::MaskNode"), ("graphene_core::vector::FlattenVectorElementsNode", "graphene_core::vector::FlattenPathNode"), + ("graphene_std::vector::BooleanOperationNode", "graphene_path_bool::BooleanOperationNode"), ]; pub fn document_migration_string_preprocessing(document_serialized_content: String) -> String { diff --git a/editor/src/messages/portfolio/menu_bar/menu_bar_message_handler.rs b/editor/src/messages/portfolio/menu_bar/menu_bar_message_handler.rs index da3067dfd2..50cfa632ac 100644 --- a/editor/src/messages/portfolio/menu_bar/menu_bar_message_handler.rs +++ b/editor/src/messages/portfolio/menu_bar/menu_bar_message_handler.rs @@ -4,7 +4,7 @@ use crate::messages::layout::utility_types::widget_prelude::*; use crate::messages::portfolio::document::utility_types::clipboards::Clipboard; use crate::messages::portfolio::document::utility_types::misc::{AlignAggregate, AlignAxis, FlipAxis, GroupFolderType}; use crate::messages::prelude::*; -use graphene_std::vector::misc::BooleanOperation; +use graphene_std::path_bool::BooleanOperation; #[derive(Debug, Clone, Default)] pub struct MenuBarMessageHandler { diff --git a/editor/src/messages/tool/tool_messages/select_tool.rs b/editor/src/messages/tool/tool_messages/select_tool.rs index d468c4dc75..b524856eef 100644 --- a/editor/src/messages/tool/tool_messages/select_tool.rs +++ b/editor/src/messages/tool/tool_messages/select_tool.rs @@ -22,10 +22,10 @@ use crate::messages::tool::common_functionality::utility_functions::{resize_boun use bezier_rs::Subpath; use glam::DMat2; use graph_craft::document::NodeId; +use graphene_std::path_bool::BooleanOperation; use graphene_std::renderer::Quad; use graphene_std::renderer::Rect; use graphene_std::transform::ReferencePoint; -use graphene_std::vector::misc::BooleanOperation; use std::fmt; #[derive(Default)] diff --git a/frontend/wasm/Cargo.toml b/frontend/wasm/Cargo.toml index b97b2f771c..2843820124 100644 --- a/frontend/wasm/Cargo.toml +++ b/frontend/wasm/Cargo.toml @@ -35,7 +35,6 @@ wasm-bindgen = { workspace = true } serde-wasm-bindgen = { workspace = true } js-sys = { workspace = true } wasm-bindgen-futures = { workspace = true } -glam = { workspace = true } math-parser = { workspace = true } wgpu = { workspace = true } web-sys = { workspace = true } diff --git a/node-graph/gcore/src/graphic_element/renderer.rs b/node-graph/gcore/src/graphic_element/renderer.rs index c8e12a4f6c..e7a243808b 100644 --- a/node-graph/gcore/src/graphic_element/renderer.rs +++ b/node-graph/gcore/src/graphic_element/renderer.rs @@ -1,3 +1,5 @@ +pub mod convert_usvg_path; + use crate::instances::Instance; pub use crate::math::quad::Quad; pub use crate::math::rect::Rect; diff --git a/node-graph/gcore/src/graphic_element/renderer/convert_usvg_path.rs b/node-graph/gcore/src/graphic_element/renderer/convert_usvg_path.rs new file mode 100644 index 0000000000..d7f76e8ba5 --- /dev/null +++ b/node-graph/gcore/src/graphic_element/renderer/convert_usvg_path.rs @@ -0,0 +1,47 @@ +use crate::vector::PointId; +use bezier_rs::{ManipulatorGroup, Subpath}; +use glam::DVec2; + +pub fn convert_usvg_path(path: &usvg::Path) -> Vec> { + let mut subpaths = Vec::new(); + let mut groups = Vec::new(); + + let mut points = path.data().points().iter(); + let to_vec = |p: &usvg::tiny_skia_path::Point| DVec2::new(p.x as f64, p.y as f64); + + for verb in path.data().verbs() { + match verb { + usvg::tiny_skia_path::PathVerb::Move => { + subpaths.push(Subpath::new(std::mem::take(&mut groups), false)); + let Some(start) = points.next().map(to_vec) else { continue }; + groups.push(ManipulatorGroup::new(start, Some(start), Some(start))); + } + usvg::tiny_skia_path::PathVerb::Line => { + let Some(end) = points.next().map(to_vec) else { continue }; + groups.push(ManipulatorGroup::new(end, Some(end), Some(end))); + } + usvg::tiny_skia_path::PathVerb::Quad => { + let Some(handle) = points.next().map(to_vec) else { continue }; + let Some(end) = points.next().map(to_vec) else { continue }; + if let Some(last) = groups.last_mut() { + last.out_handle = Some(last.anchor + (2. / 3.) * (handle - last.anchor)); + } + groups.push(ManipulatorGroup::new(end, Some(end + (2. / 3.) * (handle - end)), Some(end))); + } + usvg::tiny_skia_path::PathVerb::Cubic => { + let Some(first_handle) = points.next().map(to_vec) else { continue }; + let Some(second_handle) = points.next().map(to_vec) else { continue }; + let Some(end) = points.next().map(to_vec) else { continue }; + if let Some(last) = groups.last_mut() { + last.out_handle = Some(first_handle); + } + groups.push(ManipulatorGroup::new(end, Some(second_handle), Some(end))); + } + usvg::tiny_skia_path::PathVerb::Close => { + subpaths.push(Subpath::new(std::mem::take(&mut groups), true)); + } + } + } + subpaths.push(Subpath::new(groups, false)); + subpaths +} diff --git a/node-graph/gcore/src/vector/misc.rs b/node-graph/gcore/src/vector/misc.rs index e8b2bef9ca..4196c45d7d 100644 --- a/node-graph/gcore/src/vector/misc.rs +++ b/node-graph/gcore/src/vector/misc.rs @@ -13,22 +13,6 @@ pub enum CentroidType { Length, } -#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize, Hash, DynAny, specta::Type, node_macro::ChoiceType)] -#[widget(Radio)] -pub enum BooleanOperation { - #[default] - #[icon("BooleanUnion")] - Union, - #[icon("BooleanSubtractFront")] - SubtractFront, - #[icon("BooleanSubtractBack")] - SubtractBack, - #[icon("BooleanIntersect")] - Intersect, - #[icon("BooleanDifference")] - Difference, -} - pub trait AsU64 { fn as_u64(&self) -> u64; } diff --git a/node-graph/gpath-bool/Cargo.toml b/node-graph/gpath-bool/Cargo.toml new file mode 100644 index 0000000000..db472571a4 --- /dev/null +++ b/node-graph/gpath-bool/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "graphene-path-bool" +version = "0.1.0" +edition = "2024" +description = "graphene path bool nodes" +authors = ["Graphite Authors "] +license = "MIT OR Apache-2.0" + +[dependencies] +# Local dependencies +dyn-any = { workspace = true } +bezier-rs = { workspace = true } +graphene-core = { workspace = true } +node-macro = { workspace = true } +glam = { workspace = true } +specta = { workspace = true } +log = { workspace = true } +path-bool = { workspace = true } +serde = { workspace = true } diff --git a/node-graph/gstd/src/vector.rs b/node-graph/gpath-bool/src/lib.rs similarity index 89% rename from node-graph/gstd/src/vector.rs rename to node-graph/gpath-bool/src/lib.rs index 754f62df76..e94963298b 100644 --- a/node-graph/gstd/src/vector.rs +++ b/node-graph/gpath-bool/src/lib.rs @@ -1,10 +1,10 @@ use bezier_rs::{ManipulatorGroup, Subpath}; +use dyn_any::DynAny; use glam::{DAffine2, DVec2}; use graphene_core::instances::{Instance, InstanceRef}; use graphene_core::vector::algorithms::merge_by_distance::MergeByDistanceExt; -use graphene_core::vector::misc::BooleanOperation; use graphene_core::vector::style::Fill; -pub use graphene_core::vector::*; +use graphene_core::vector::{PointId, VectorData, VectorDataTable}; use graphene_core::{Color, Ctx, GraphicElement, GraphicGroupTable}; pub use path_bool as path_bool_lib; use path_bool::{FillRule, PathBooleanOperation}; @@ -14,6 +14,22 @@ use std::ops::Mul; // TODO: since before we used a Vec of single-row tables and now we use a single table // TODO: with multiple rows while still assuming a single row for the boolean operations. +#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize, Hash, DynAny, specta::Type, node_macro::ChoiceType)] +#[widget(Radio)] +pub enum BooleanOperation { + #[default] + #[icon("BooleanUnion")] + Union, + #[icon("BooleanSubtractFront")] + SubtractFront, + #[icon("BooleanSubtractBack")] + SubtractBack, + #[icon("BooleanIntersect")] + Intersect, + #[icon("BooleanDifference")] + Difference, +} + /// Combines the geometric forms of one or more closed paths into a new vector path that results from cutting or joining the paths by the chosen method. #[node_macro::node(category(""))] async fn boolean_operation + 'n + Send + Clone>( @@ -356,50 +372,6 @@ fn from_path(path_data: &[Path]) -> VectorData { VectorData::from_subpaths(all_subpaths, false) } -pub fn convert_usvg_path(path: &usvg::Path) -> Vec> { - let mut subpaths = Vec::new(); - let mut groups = Vec::new(); - - let mut points = path.data().points().iter(); - let to_vec = |p: &usvg::tiny_skia_path::Point| DVec2::new(p.x as f64, p.y as f64); - - for verb in path.data().verbs() { - match verb { - usvg::tiny_skia_path::PathVerb::Move => { - subpaths.push(Subpath::new(std::mem::take(&mut groups), false)); - let Some(start) = points.next().map(to_vec) else { continue }; - groups.push(ManipulatorGroup::new(start, Some(start), Some(start))); - } - usvg::tiny_skia_path::PathVerb::Line => { - let Some(end) = points.next().map(to_vec) else { continue }; - groups.push(ManipulatorGroup::new(end, Some(end), Some(end))); - } - usvg::tiny_skia_path::PathVerb::Quad => { - let Some(handle) = points.next().map(to_vec) else { continue }; - let Some(end) = points.next().map(to_vec) else { continue }; - if let Some(last) = groups.last_mut() { - last.out_handle = Some(last.anchor + (2. / 3.) * (handle - last.anchor)); - } - groups.push(ManipulatorGroup::new(end, Some(end + (2. / 3.) * (handle - end)), Some(end))); - } - usvg::tiny_skia_path::PathVerb::Cubic => { - let Some(first_handle) = points.next().map(to_vec) else { continue }; - let Some(second_handle) = points.next().map(to_vec) else { continue }; - let Some(end) = points.next().map(to_vec) else { continue }; - if let Some(last) = groups.last_mut() { - last.out_handle = Some(first_handle); - } - groups.push(ManipulatorGroup::new(end, Some(second_handle), Some(end))); - } - usvg::tiny_skia_path::PathVerb::Close => { - subpaths.push(Subpath::new(std::mem::take(&mut groups), true)); - } - } - } - subpaths.push(Subpath::new(groups, false)); - subpaths -} - type Path = Vec; fn boolean_union(a: Path, b: Path) -> Vec { diff --git a/node-graph/graph-craft/Cargo.toml b/node-graph/graph-craft/Cargo.toml index 963ef97e72..5439a0314f 100644 --- a/node-graph/graph-craft/Cargo.toml +++ b/node-graph/graph-craft/Cargo.toml @@ -16,6 +16,7 @@ loading = ["serde_json"] # Local dependencies dyn-any = { workspace = true } graphene-core = { workspace = true } +graphene-path-bool = { workspace = true } graphene-application-io = { workspace = true } # Workspace dependencies diff --git a/node-graph/graph-craft/src/document/value.rs b/node-graph/graph-craft/src/document/value.rs index 3decf5d9c9..e7f4812c87 100644 --- a/node-graph/graph-craft/src/document/value.rs +++ b/node-graph/graph-craft/src/document/value.rs @@ -247,7 +247,7 @@ tagged_value! { GradientType(graphene_core::vector::style::GradientType), ReferencePoint(graphene_core::transform::ReferencePoint), CentroidType(graphene_core::vector::misc::CentroidType), - BooleanOperation(graphene_core::vector::misc::BooleanOperation), + BooleanOperation(graphene_path_bool::BooleanOperation), } impl TaggedValue { diff --git a/node-graph/gstd/Cargo.toml b/node-graph/gstd/Cargo.toml index 728674a5bf..9fff8e36c9 100644 --- a/node-graph/gstd/Cargo.toml +++ b/node-graph/gstd/Cargo.toml @@ -28,18 +28,16 @@ dyn-any = { workspace = true } graph-craft = { workspace = true } wgpu-executor = { workspace = true } graphene-core = { workspace = true } +graphene-path-bool = { workspace = true } graphene-application-io = { workspace = true } # Workspace dependencies fastnoise-lite = { workspace = true } log = { workspace = true } -bezier-rs = { workspace = true } -path-bool = { workspace = true } glam = { workspace = true } node-macro = { workspace = true } reqwest = { workspace = true } futures = { workspace = true } -usvg = { workspace = true } rand_chacha = { workspace = true } rand = { workspace = true } bytemuck = { workspace = true } diff --git a/node-graph/gstd/src/lib.rs b/node-graph/gstd/src/lib.rs index ffc6b99380..f8384f5471 100644 --- a/node-graph/gstd/src/lib.rs +++ b/node-graph/gstd/src/lib.rs @@ -6,9 +6,10 @@ pub mod http; pub mod image_color_palette; pub mod raster; pub mod text; -pub mod vector; #[cfg(feature = "wasm")] pub mod wasm_application_io; pub use graphene_application_io as application_io; +pub use graphene_core::vector; pub use graphene_core::*; +pub use graphene_path_bool as path_bool; diff --git a/node-graph/interpreted-executor/Cargo.toml b/node-graph/interpreted-executor/Cargo.toml index f862c0419b..119b8affb6 100644 --- a/node-graph/interpreted-executor/Cargo.toml +++ b/node-graph/interpreted-executor/Cargo.toml @@ -14,6 +14,7 @@ graphene-std = { workspace = true } graph-craft = { workspace = true } wgpu-executor = { workspace = true } graphene-core = { workspace = true } +graphene-path-bool = { workspace = true } dyn-any = { workspace = true } # Workspace dependencies diff --git a/node-graph/interpreted-executor/src/node_registry.rs b/node-graph/interpreted-executor/src/node_registry.rs index 838f99852f..ddd71abdbf 100644 --- a/node-graph/interpreted-executor/src/node_registry.rs +++ b/node-graph/interpreted-executor/src/node_registry.rs @@ -60,7 +60,7 @@ fn node_registry() -> HashMap, input: Context, fn_params: [Context => Vec]), async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => BlendMode]), async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => graphene_std::transform::ReferencePoint]), - async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => graphene_core::vector::misc::BooleanOperation]), + async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => graphene_path_bool::BooleanOperation]), async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => Option]), async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => graphene_core::vector::style::Fill]), async_node!(graphene_core::memo::MonitorNode<_, _, _>, input: Context, fn_params: [Context => graphene_core::vector::style::StrokeCap]), diff --git a/node-graph/preprocessor/Cargo.toml b/node-graph/preprocessor/Cargo.toml index b6bfd092e0..e39fef365c 100644 --- a/node-graph/preprocessor/Cargo.toml +++ b/node-graph/preprocessor/Cargo.toml @@ -7,23 +7,8 @@ license = "MIT OR Apache-2.0" [features] [dependencies] -# Local dependencies -dyn-any = { path = "../../libraries/dyn-any", features = [ - "log-bad-types", - "rc", - "glam", -] } # Workspace dependencies graphene-std = { workspace = true, features = ["gpu"] } graph-craft = { workspace = true } interpreted-executor = { workspace = true } -log = { workspace = true } -futures = { workspace = true } -glam = { workspace = true } -base64 = { workspace = true } - -# Optional workspace dependencies -serde = { workspace = true, optional = true } -tokio = { workspace = true, optional = true } -serde_json = { workspace = true, optional = true } From 9c4ab34a5830932a1aa4d485d2f511a2061896ef Mon Sep 17 00:00:00 2001 From: Firestar99 Date: Fri, 27 Jun 2025 15:47:46 +0200 Subject: [PATCH 31/44] Extract `gsvg_renderer` from `gcore`, remove `gcore/vello` feature (#2760) Extract `gsvg_renderer` from `gcore`, remove `gcore/vello` feature --- Cargo.lock | 21 +- Cargo.toml | 3 + node-graph/gcore/Cargo.toml | 3 - node-graph/gcore/src/blending.rs | 31 -- node-graph/gcore/src/bounds.rs | 24 ++ node-graph/gcore/src/graphic_element.rs | 51 +++- node-graph/gcore/src/lib.rs | 1 + node-graph/gcore/src/raster_types.rs | 20 +- node-graph/gcore/src/vector/click_target.rs | 2 +- node-graph/gcore/src/vector/style.rs | 178 +---------- node-graph/gcore/src/vector/vector_data.rs | 26 ++ node-graph/gcore/src/vector/vector_nodes.rs | 23 +- node-graph/graph-craft/Cargo.toml | 1 + node-graph/graph-craft/src/document/value.rs | 2 +- node-graph/gstd/Cargo.toml | 3 +- node-graph/gstd/src/brush.rs | 2 +- node-graph/gstd/src/lib.rs | 7 + node-graph/gstd/src/wasm_application_io.rs | 4 +- node-graph/gsvg-renderer/Cargo.toml | 27 ++ .../src}/convert_usvg_path.rs | 2 +- node-graph/gsvg-renderer/src/lib.rs | 6 + node-graph/gsvg-renderer/src/render_ext.rs | 278 ++++++++++++++++++ .../src}/renderer.rs | 155 ++-------- node-graph/gsvg-renderer/src/to_peniko.rs | 38 +++ node-graph/wgpu-executor/Cargo.toml | 3 +- node-graph/wgpu-executor/src/lib.rs | 3 +- 26 files changed, 546 insertions(+), 368 deletions(-) create mode 100644 node-graph/gcore/src/bounds.rs create mode 100644 node-graph/gsvg-renderer/Cargo.toml rename node-graph/{gcore/src/graphic_element/renderer => gsvg-renderer/src}/convert_usvg_path.rs (98%) create mode 100644 node-graph/gsvg-renderer/src/lib.rs create mode 100644 node-graph/gsvg-renderer/src/render_ext.rs rename node-graph/{gcore/src/graphic_element => gsvg-renderer/src}/renderer.rs (89%) create mode 100644 node-graph/gsvg-renderer/src/to_peniko.rs diff --git a/Cargo.lock b/Cargo.lock index 71b2b6c4c0..04c0788ed4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2133,6 +2133,7 @@ dependencies = [ "graphene-application-io", "graphene-core", "graphene-path-bool", + "graphene-svg-renderer", "iai-callgrind", "js-sys", "log", @@ -2210,8 +2211,6 @@ dependencies = [ "specta", "tinyvec", "tokio", - "usvg", - "vello", "wgpu", ] @@ -2244,6 +2243,7 @@ dependencies = [ "graphene-application-io", "graphene-core", "graphene-path-bool", + "graphene-svg-renderer", "image", "log", "ndarray", @@ -2259,6 +2259,22 @@ dependencies = [ "wgpu-executor", ] +[[package]] +name = "graphene-svg-renderer" +version = "0.1.0" +dependencies = [ + "base64 0.22.1", + "bezier-rs", + "dyn-any", + "glam", + "graphene-core", + "log", + "num-traits", + "serde", + "usvg", + "vello", +] + [[package]] name = "graphite-desktop" version = "0.1.0" @@ -7427,6 +7443,7 @@ dependencies = [ "glam", "graphene-application-io", "graphene-core", + "graphene-svg-renderer", "node-macro", "vello", "web-sys", diff --git a/Cargo.toml b/Cargo.toml index bcdd4569c9..27e5613a95 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,6 +10,7 @@ members = [ "node-graph/gpath-bool", "node-graph/graph-craft", "node-graph/graphene-cli", + "node-graph/gsvg-renderer", "node-graph/interpreted-executor", "node-graph/node-macro", "node-graph/preprocessor", @@ -27,6 +28,7 @@ default-members = [ "node-graph/gpath-bool", "node-graph/graph-craft", "node-graph/graphene-cli", + "node-graph/gsvg-renderer", "node-graph/interpreted-executor", "node-graph/node-macro", ] @@ -44,6 +46,7 @@ graphene-core = { path = "node-graph/gcore" } graphene-path-bool = { path = "node-graph/gpath-bool" } graph-craft = { path = "node-graph/graph-craft" } graphene-std = { path = "node-graph/gstd" } +graphene-svg-renderer = { path = "node-graph/gsvg-renderer" } interpreted-executor = { path = "node-graph/interpreted-executor" } node-macro = { path = "node-graph/node-macro" } wgpu-executor = { path = "node-graph/wgpu-executor" } diff --git a/node-graph/gcore/Cargo.toml b/node-graph/gcore/Cargo.toml index 01dd3b12c6..07daf7933b 100644 --- a/node-graph/gcore/Cargo.toml +++ b/node-graph/gcore/Cargo.toml @@ -11,7 +11,6 @@ default = ["serde"] nightly = [] type_id_logging = [] wgpu = ["dep:wgpu"] -vello = ["dep:vello", "bezier-rs/kurbo", "wgpu"] dealloc_nodes = [] [dependencies] @@ -23,7 +22,6 @@ bytemuck = { workspace = true } node-macro = { workspace = true } num-derive = { workspace = true } num-traits = { workspace = true } -usvg = { workspace = true } rand = { workspace = true } glam = { workspace = true } serde_json = { workspace = true } @@ -44,7 +42,6 @@ base64 = { workspace = true } # Optional workspace dependencies serde = { workspace = true, optional = true } -vello = { workspace = true, optional = true } wgpu = { workspace = true, optional = true } [dev-dependencies] diff --git a/node-graph/gcore/src/blending.rs b/node-graph/gcore/src/blending.rs index 18cc4fc604..921fb0d0ae 100644 --- a/node-graph/gcore/src/blending.rs +++ b/node-graph/gcore/src/blending.rs @@ -238,34 +238,3 @@ impl std::fmt::Display for BlendMode { } } } - -#[cfg(feature = "vello")] -impl From for vello::peniko::Mix { - fn from(val: BlendMode) -> Self { - match val { - // Normal group - BlendMode::Normal => vello::peniko::Mix::Normal, - // Darken group - BlendMode::Darken => vello::peniko::Mix::Darken, - BlendMode::Multiply => vello::peniko::Mix::Multiply, - BlendMode::ColorBurn => vello::peniko::Mix::ColorBurn, - // Lighten group - BlendMode::Lighten => vello::peniko::Mix::Lighten, - BlendMode::Screen => vello::peniko::Mix::Screen, - BlendMode::ColorDodge => vello::peniko::Mix::ColorDodge, - // Contrast group - BlendMode::Overlay => vello::peniko::Mix::Overlay, - BlendMode::SoftLight => vello::peniko::Mix::SoftLight, - BlendMode::HardLight => vello::peniko::Mix::HardLight, - // Inversion group - BlendMode::Difference => vello::peniko::Mix::Difference, - BlendMode::Exclusion => vello::peniko::Mix::Exclusion, - // Component group - BlendMode::Hue => vello::peniko::Mix::Hue, - BlendMode::Saturation => vello::peniko::Mix::Saturation, - BlendMode::Color => vello::peniko::Mix::Color, - BlendMode::Luminosity => vello::peniko::Mix::Luminosity, - _ => todo!(), - } - } -} diff --git a/node-graph/gcore/src/bounds.rs b/node-graph/gcore/src/bounds.rs new file mode 100644 index 0000000000..ccc373d4cf --- /dev/null +++ b/node-graph/gcore/src/bounds.rs @@ -0,0 +1,24 @@ +use crate::Color; +use glam::{DAffine2, DVec2}; + +pub trait BoundingBox { + fn bounding_box(&self, transform: DAffine2, include_stroke: bool) -> Option<[DVec2; 2]>; +} + +macro_rules! none_impl { + ($t:path) => { + impl BoundingBox for $t { + fn bounding_box(&self, _transform: DAffine2, _include_stroke: bool) -> Option<[DVec2; 2]> { + None + } + } + }; +} + +none_impl!(String); +none_impl!(bool); +none_impl!(f32); +none_impl!(f64); +none_impl!(DVec2); +none_impl!(Option); +none_impl!(Vec); diff --git a/node-graph/gcore/src/graphic_element.rs b/node-graph/gcore/src/graphic_element.rs index 744172b26b..915d82344a 100644 --- a/node-graph/gcore/src/graphic_element.rs +++ b/node-graph/gcore/src/graphic_element.rs @@ -1,5 +1,7 @@ use crate::blending::AlphaBlending; +use crate::bounds::BoundingBox; use crate::instances::{Instance, Instances}; +use crate::math::quad::Quad; use crate::raster::image::Image; use crate::raster_types::{CPU, GPU, Raster, RasterDataTable}; use crate::transform::TransformMut; @@ -7,11 +9,9 @@ use crate::uuid::NodeId; use crate::vector::{VectorData, VectorDataTable}; use crate::{CloneVarArgs, Color, Context, Ctx, ExtractAll, OwnedContextImpl}; use dyn_any::DynAny; -use glam::{DAffine2, IVec2}; +use glam::{DAffine2, DVec2, IVec2}; use std::hash::Hash; -pub mod renderer; - // TODO: Eventually remove this migration document upgrade code pub fn migrate_graphic_group<'de, D: serde::Deserializer<'de>>(deserializer: D) -> Result { use serde::Deserialize; @@ -182,6 +182,25 @@ impl GraphicElement { } } +impl BoundingBox for GraphicElement { + fn bounding_box(&self, transform: DAffine2, include_stroke: bool) -> Option<[DVec2; 2]> { + match self { + GraphicElement::VectorData(vector_data) => vector_data.bounding_box(transform, include_stroke), + GraphicElement::RasterDataCPU(raster) => raster.bounding_box(transform, include_stroke), + GraphicElement::RasterDataGPU(raster) => raster.bounding_box(transform, include_stroke), + GraphicElement::GraphicGroup(graphic_group) => graphic_group.bounding_box(transform, include_stroke), + } + } +} + +impl BoundingBox for GraphicGroupTable { + fn bounding_box(&self, transform: DAffine2, include_stroke: bool) -> Option<[DVec2; 2]> { + self.instance_ref_iter() + .filter_map(|element| element.instance.bounding_box(transform * *element.transform, include_stroke)) + .reduce(Quad::combine_bounds) + } +} + impl<'de> serde::Deserialize<'de> for Raster { fn deserialize(deserializer: D) -> Result where @@ -247,6 +266,20 @@ impl Artboard { } } +impl BoundingBox for Artboard { + fn bounding_box(&self, transform: DAffine2, include_stroke: bool) -> Option<[DVec2; 2]> { + let artboard_bounds = (transform * Quad::from_box([self.location.as_dvec2(), self.location.as_dvec2() + self.dimensions.as_dvec2()])).bounding_box(); + if self.clip { + Some(artboard_bounds) + } else { + [self.graphic_group.bounding_box(transform, include_stroke), Some(artboard_bounds)] + .into_iter() + .flatten() + .reduce(Quad::combine_bounds) + } + } +} + // TODO: Eventually remove this migration document upgrade code pub fn migrate_artboard_group<'de, D: serde::Deserializer<'de>>(deserializer: D) -> Result { use serde::Deserialize; @@ -282,6 +315,14 @@ pub fn migrate_artboard_group<'de, D: serde::Deserializer<'de>>(deserializer: D) pub type ArtboardGroupTable = Instances; +impl BoundingBox for ArtboardGroupTable { + fn bounding_box(&self, transform: DAffine2, include_stroke: bool) -> Option<[DVec2; 2]> { + self.instance_ref_iter() + .filter_map(|instance| instance.instance.bounding_box(transform, include_stroke)) + .reduce(Quad::combine_bounds) + } +} + #[node_macro::node(category(""))] async fn layer( _: impl Ctx, @@ -506,3 +547,7 @@ impl From for GraphicElement { GraphicElement::GraphicGroup(graphic_group) } } + +pub trait ToGraphicElement { + fn to_graphic_element(&self) -> GraphicElement; +} diff --git a/node-graph/gcore/src/lib.rs b/node-graph/gcore/src/lib.rs index 1a66b38f20..9c47ea6fdd 100644 --- a/node-graph/gcore/src/lib.rs +++ b/node-graph/gcore/src/lib.rs @@ -4,6 +4,7 @@ extern crate log; pub mod animation; pub mod blending; pub mod blending_nodes; +pub mod bounds; pub mod color; pub mod consts; pub mod context; diff --git a/node-graph/gcore/src/raster_types.rs b/node-graph/gcore/src/raster_types.rs index 45d9ec2019..0c34ba0c5e 100644 --- a/node-graph/gcore/src/raster_types.rs +++ b/node-graph/gcore/src/raster_types.rs @@ -1,8 +1,11 @@ use crate::Color; +use crate::bounds::BoundingBox; use crate::instances::Instances; +use crate::math::quad::Quad; use crate::raster::Image; use core::ops::Deref; use dyn_any::DynAny; +use glam::{DAffine2, DVec2}; #[cfg(feature = "wgpu")] use std::sync::Arc; @@ -11,18 +14,18 @@ pub struct CPU; #[derive(Clone, Debug, Hash, PartialEq, Eq, Copy)] pub struct GPU; -trait Storage {} +trait Storage: 'static {} impl Storage for CPU {} impl Storage for GPU {} #[derive(Clone, Debug, Hash, PartialEq)] #[allow(private_bounds)] -pub struct Raster { +pub struct Raster { data: RasterStorage, storage: T, } -unsafe impl dyn_any::StaticType for Raster { +unsafe impl dyn_any::StaticType for Raster { type Static = Raster; } #[derive(Clone, Debug, Hash, PartialEq, DynAny)] @@ -100,3 +103,14 @@ impl Deref for Raster { } } pub type RasterDataTable = Instances>; + +impl BoundingBox for RasterDataTable { + fn bounding_box(&self, transform: DAffine2, _include_stroke: bool) -> Option<[DVec2; 2]> { + self.instance_ref_iter() + .flat_map(|instance| { + let transform = transform * *instance.transform; + (transform.matrix2.determinant() != 0.).then(|| (transform * Quad::from_box([DVec2::ZERO, DVec2::ONE])).bounding_box()) + }) + .reduce(Quad::combine_bounds) + } +} diff --git a/node-graph/gcore/src/vector/click_target.rs b/node-graph/gcore/src/vector/click_target.rs index a1d068682f..365c2c7ee0 100644 --- a/node-graph/gcore/src/vector/click_target.rs +++ b/node-graph/gcore/src/vector/click_target.rs @@ -1,5 +1,5 @@ use crate::math::math_ext::QuadExt; -use crate::renderer::Quad; +use crate::math::quad::Quad; use crate::vector::PointId; use bezier_rs::Subpath; use glam::{DAffine2, DMat2, DVec2}; diff --git a/node-graph/gcore/src/vector/style.rs b/node-graph/gcore/src/vector/style.rs index 3a91651449..c1901ce905 100644 --- a/node-graph/gcore/src/vector/style.rs +++ b/node-graph/gcore/src/vector/style.rs @@ -1,70 +1,9 @@ //! Contains stylistic options for SVG elements. use crate::Color; -use crate::consts::{LAYER_OUTLINE_STROKE_COLOR, LAYER_OUTLINE_STROKE_WEIGHT}; pub use crate::gradient::*; -use crate::renderer::{RenderParams, format_transform_matrix}; use dyn_any::DynAny; -use glam::{DAffine2, DVec2}; -use std::fmt::Write; - -impl Gradient { - /// Adds the gradient def through mutating the first argument, returning the gradient ID. - fn render_defs(&self, svg_defs: &mut String, element_transform: DAffine2, stroke_transform: DAffine2, bounds: [DVec2; 2], transformed_bounds: [DVec2; 2], _render_params: &RenderParams) -> u64 { - // TODO: Figure out how to use `self.transform` as part of the gradient transform, since that field (`Gradient::transform`) is currently never read from, it's only written to. - - let bound_transform = DAffine2::from_scale_angle_translation(bounds[1] - bounds[0], 0., bounds[0]); - let transformed_bound_transform = element_transform * DAffine2::from_scale_angle_translation(transformed_bounds[1] - transformed_bounds[0], 0., transformed_bounds[0]); - - let mut stop = String::new(); - for (position, color) in self.stops.0.iter() { - stop.push_str("") - } - - let mod_gradient = if transformed_bound_transform.matrix2.determinant() != 0. { - transformed_bound_transform.inverse() - } else { - DAffine2::IDENTITY // Ignore if the transform cannot be inverted (the bounds are zero). See issue #1944. - }; - let mod_points = element_transform * stroke_transform * bound_transform; - - let start = mod_points.transform_point2(self.start); - let end = mod_points.transform_point2(self.end); - - let gradient_id = crate::uuid::generate_uuid(); - - let matrix = format_transform_matrix(mod_gradient); - let gradient_transform = if matrix.is_empty() { String::new() } else { format!(r#" gradientTransform="{}""#, matrix) }; - - match self.gradient_type { - GradientType::Linear => { - let _ = write!( - svg_defs, - r#"{}"#, - gradient_id, start.x, end.x, start.y, end.y, stop - ); - } - GradientType::Radial => { - let radius = (f64::powi(start.x - end.x, 2) + f64::powi(start.y - end.y, 2)).sqrt(); - let _ = write!( - svg_defs, - r#"{}"#, - gradient_id, start.x, start.y, radius, stop - ); - } - } - - gradient_id - } -} +use glam::DAffine2; /// Describes the fill of a layer. /// @@ -138,24 +77,6 @@ impl Fill { } } - /// Renders the fill, adding necessary defs through mutating the first argument. - pub fn render(&self, svg_defs: &mut String, element_transform: DAffine2, stroke_transform: DAffine2, bounds: [DVec2; 2], transformed_bounds: [DVec2; 2], render_params: &RenderParams) -> String { - match self { - Self::None => r#" fill="none""#.to_string(), - Self::Solid(color) => { - let mut result = format!(r##" fill="#{}""##, color.to_rgb_hex_srgb_from_gamma()); - if color.a() < 1. { - let _ = write!(result, r#" fill-opacity="{}""#, (color.a() * 1000.).round() / 1000.); - } - result - } - Self::Gradient(gradient) => { - let gradient_id = gradient.render_defs(svg_defs, element_transform, stroke_transform, bounds, transformed_bounds, render_params); - format!(r##" fill="url('#{gradient_id}')""##) - } - } - } - /// Extract a gradient from the fill pub fn as_gradient(&self) -> Option<&Gradient> { match self { @@ -279,7 +200,7 @@ pub enum StrokeCap { } impl StrokeCap { - fn svg_name(&self) -> &'static str { + pub fn svg_name(&self) -> &'static str { match self { StrokeCap::Butt => "butt", StrokeCap::Round => "round", @@ -299,7 +220,7 @@ pub enum StrokeJoin { } impl StrokeJoin { - fn svg_name(&self) -> &'static str { + pub fn svg_name(&self) -> &'static str { match self { StrokeJoin::Bevel => "bevel", StrokeJoin::Miter => "miter", @@ -469,60 +390,6 @@ impl Stroke { self.join_miter_limit as f32 } - /// Provide the SVG attributes for the stroke. - pub fn render(&self, aligned_strokes: bool, override_paint_order: bool, _render_params: &RenderParams) -> String { - // Don't render a stroke at all if it would be invisible - let Some(color) = self.color else { return String::new() }; - if !self.has_renderable_stroke() { - return String::new(); - } - - // Set to None if the value is the SVG default - let weight = (self.weight != 1.).then_some(self.weight); - let dash_array = (!self.dash_lengths.is_empty()).then_some(self.dash_lengths()); - let dash_offset = (self.dash_offset != 0.).then_some(self.dash_offset); - let stroke_cap = (self.cap != StrokeCap::Butt).then_some(self.cap); - let stroke_join = (self.join != StrokeJoin::Miter).then_some(self.join); - let stroke_join_miter_limit = (self.join_miter_limit != 4.).then_some(self.join_miter_limit); - let stroke_align = (self.align != StrokeAlign::Center).then_some(self.align); - let paint_order = (self.paint_order != PaintOrder::StrokeAbove || override_paint_order).then_some(PaintOrder::StrokeBelow); - - // Render the needed stroke attributes - let mut attributes = format!(r##" stroke="#{}""##, color.to_rgb_hex_srgb_from_gamma()); - if color.a() < 1. { - let _ = write!(&mut attributes, r#" stroke-opacity="{}""#, (color.a() * 1000.).round() / 1000.); - } - if let Some(mut weight) = weight { - if stroke_align.is_some() && aligned_strokes { - weight *= 2.; - } - let _ = write!(&mut attributes, r#" stroke-width="{}""#, weight); - } - if let Some(dash_array) = dash_array { - let _ = write!(&mut attributes, r#" stroke-dasharray="{}""#, dash_array); - } - if let Some(dash_offset) = dash_offset { - let _ = write!(&mut attributes, r#" stroke-dashoffset="{}""#, dash_offset); - } - if let Some(stroke_cap) = stroke_cap { - let _ = write!(&mut attributes, r#" stroke-linecap="{}""#, stroke_cap.svg_name()); - } - if let Some(stroke_join) = stroke_join { - let _ = write!(&mut attributes, r#" stroke-linejoin="{}""#, stroke_join.svg_name()); - } - if let Some(stroke_join_miter_limit) = stroke_join_miter_limit { - let _ = write!(&mut attributes, r#" stroke-miterlimit="{}""#, stroke_join_miter_limit); - } - // Add vector-effect attribute to make strokes non-scaling - if self.non_scaling { - let _ = write!(&mut attributes, r#" vector-effect="non-scaling-stroke""#); - } - if paint_order.is_some() { - let _ = write!(&mut attributes, r#" style="paint-order: stroke;" "#); - } - attributes - } - pub fn with_color(mut self, color: &Option) -> Option { self.color = *color; @@ -604,8 +471,8 @@ impl Default for Stroke { #[repr(C)] #[derive(Debug, Clone, PartialEq, Default, serde::Serialize, serde::Deserialize, DynAny, specta::Type)] pub struct PathStyle { - stroke: Option, - fill: Fill, + pub stroke: Option, + pub fill: Fill, } impl std::hash::Hash for PathStyle { @@ -766,41 +633,6 @@ impl PathStyle { pub fn clear_stroke(&mut self) { self.stroke = None; } - - /// Renders the shape's fill and stroke attributes as a string with them concatenated together. - #[allow(clippy::too_many_arguments)] - pub fn render( - &self, - svg_defs: &mut String, - element_transform: DAffine2, - stroke_transform: DAffine2, - bounds: [DVec2; 2], - transformed_bounds: [DVec2; 2], - aligned_strokes: bool, - override_paint_order: bool, - render_params: &RenderParams, - ) -> String { - let view_mode = render_params.view_mode; - match view_mode { - ViewMode::Outline => { - let fill_attribute = Fill::None.render(svg_defs, element_transform, stroke_transform, bounds, transformed_bounds, render_params); - let mut outline_stroke = Stroke::new(Some(LAYER_OUTLINE_STROKE_COLOR), LAYER_OUTLINE_STROKE_WEIGHT); - // Outline strokes should be non-scaling by default - outline_stroke.non_scaling = true; - let stroke_attribute = outline_stroke.render(aligned_strokes, override_paint_order, render_params); - format!("{fill_attribute}{stroke_attribute}") - } - _ => { - let fill_attribute = self.fill.render(svg_defs, element_transform, stroke_transform, bounds, transformed_bounds, render_params); - let stroke_attribute = self - .stroke - .as_ref() - .map(|stroke| stroke.render(aligned_strokes, override_paint_order, render_params)) - .unwrap_or_default(); - format!("{fill_attribute}{stroke_attribute}") - } - } - } } /// Represents different ways of rendering an object diff --git a/node-graph/gcore/src/vector/vector_data.rs b/node-graph/gcore/src/vector/vector_data.rs index 7a596058d5..4a6a66034a 100644 --- a/node-graph/gcore/src/vector/vector_data.rs +++ b/node-graph/gcore/src/vector/vector_data.rs @@ -4,7 +4,10 @@ mod modification; use super::misc::{dvec2_to_point, point_to_dvec2}; use super::style::{PathStyle, Stroke}; +use crate::bounds::BoundingBox; use crate::instances::Instances; +use crate::math::quad::Quad; +use crate::transform::Transform; use crate::vector::click_target::{ClickTargetType, FreePoint}; use crate::{AlphaBlending, Color, GraphicGroupTable}; pub use attributes::*; @@ -487,6 +490,29 @@ impl VectorData { } } +impl BoundingBox for VectorDataTable { + fn bounding_box(&self, transform: DAffine2, include_stroke: bool) -> Option<[DVec2; 2]> { + self.instance_ref_iter() + .flat_map(|instance| { + if !include_stroke { + return instance.instance.bounding_box_with_transform(transform * *instance.transform); + } + + let stroke_width = instance.instance.style.stroke().map(|s| s.weight()).unwrap_or_default(); + + let miter_limit = instance.instance.style.stroke().map(|s| s.join_miter_limit).unwrap_or(1.); + + let scale = transform.decompose_scale(); + + // We use the full line width here to account for different styles of stroke caps + let offset = DVec2::splat(stroke_width * scale.x.max(scale.y) * miter_limit); + + instance.instance.bounding_box_with_transform(transform * *instance.transform).map(|[a, b]| [a - offset, b + offset]) + }) + .reduce(Quad::combine_bounds) + } +} + /// A selectable part of a curve, either an anchor (start or end of a bézier) or a handle (doesn't necessarily go through the bézier but influences curvature). #[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, DynAny, serde::Serialize, serde::Deserialize)] pub enum ManipulatorPointId { diff --git a/node-graph/gcore/src/vector/vector_nodes.rs b/node-graph/gcore/src/vector/vector_nodes.rs index 877e2bc4ff..009d7ab357 100644 --- a/node-graph/gcore/src/vector/vector_nodes.rs +++ b/node-graph/gcore/src/vector/vector_nodes.rs @@ -4,10 +4,10 @@ use super::algorithms::spline::{solve_spline_first_handle_closed, solve_spline_f use super::misc::{CentroidType, point_to_dvec2}; use super::style::{Fill, Gradient, GradientStops, Stroke}; use super::{PointId, SegmentDomain, SegmentId, StrokeId, VectorData, VectorDataExt, VectorDataTable}; +use crate::bounds::BoundingBox; use crate::instances::{Instance, InstanceMut, Instances}; use crate::raster_types::{CPU, GPU, RasterDataTable}; use crate::registry::types::{Angle, Fraction, IntegerCount, Length, Multiplier, Percentage, PixelLength, PixelSize, SeedValue}; -use crate::renderer::GraphicElementRendered; use crate::transform::{Footprint, ReferencePoint, Transform}; use crate::vector::algorithms::merge_by_distance::MergeByDistanceExt; use crate::vector::misc::{MergeByDistanceAlgorithm, PointSpacingType}; @@ -221,10 +221,7 @@ async fn repeat( direction: PixelSize, angle: Angle, #[default(4)] instances: IntegerCount, -) -> Instances -where - Instances: GraphicElementRendered, -{ +) -> Instances { let angle = angle.to_radians(); let count = instances.max(1); let total = (count - 1) as f64; @@ -258,10 +255,7 @@ async fn circular_repeat( angle_offset: Angle, #[default(5)] radius: f64, #[default(5)] instances: IntegerCount, -) -> Instances -where - Instances: GraphicElementRendered, -{ +) -> Instances { let count = instances.max(1); let mut result_table = Instances::::default(); @@ -313,10 +307,7 @@ async fn copy_to_points( random_rotation: Angle, /// Seed to determine unique variations on all the randomized instance angles. random_rotation_seed: SeedValue, -) -> Instances -where - Instances: GraphicElementRendered, -{ +) -> Instances { let mut result_table = Instances::::default(); let random_scale_difference = random_scale_max - random_scale_min; @@ -377,7 +368,7 @@ async fn mirror( #[default(true)] keep_original: bool, ) -> Instances where - Instances: GraphicElementRendered, + Instances: BoundingBox, { let mut result_table = Instances::default(); @@ -1090,7 +1081,7 @@ async fn solidify_stroke(_: impl Ctx, vector_data: VectorDataTable) -> VectorDat #[node_macro::node(category("Vector"), path(graphene_core::vector))] async fn flatten_path(_: impl Ctx, #[implementations(GraphicGroupTable, VectorDataTable)] graphic_group_input: Instances) -> VectorDataTable where - Instances: GraphicElementRendered, + GraphicElement: From>, { // A node based solution to support passing through vector data could be a network node with a cache node connected to // a Flatten Path connected to an if else node, another connection from the cache directly @@ -1135,7 +1126,7 @@ where }; // Flatten the graphic group input into the output VectorData instance - let base_graphic_group = GraphicGroupTable::new(graphic_group_input.to_graphic_element()); + let base_graphic_group = GraphicGroupTable::new(GraphicElement::from(graphic_group_input)); flatten_group(&base_graphic_group, &mut output); // Return the single-row VectorDataTable containing the flattened VectorData subpaths diff --git a/node-graph/graph-craft/Cargo.toml b/node-graph/graph-craft/Cargo.toml index 5439a0314f..c4bcf7e0d8 100644 --- a/node-graph/graph-craft/Cargo.toml +++ b/node-graph/graph-craft/Cargo.toml @@ -18,6 +18,7 @@ dyn-any = { workspace = true } graphene-core = { workspace = true } graphene-path-bool = { workspace = true } graphene-application-io = { workspace = true } +graphene-svg-renderer = { workspace = true } # Workspace dependencies log = { workspace = true } diff --git a/node-graph/graph-craft/src/document/value.rs b/node-graph/graph-craft/src/document/value.rs index e7f4812c87..699b811dd4 100644 --- a/node-graph/graph-craft/src/document/value.rs +++ b/node-graph/graph-craft/src/document/value.rs @@ -8,11 +8,11 @@ use graphene_application_io::SurfaceFrame; use graphene_core::raster::brush_cache::BrushCache; use graphene_core::raster::{BlendMode, LuminanceCalculation}; use graphene_core::raster_types::CPU; -use graphene_core::renderer::RenderMetadata; use graphene_core::transform::ReferencePoint; use graphene_core::uuid::NodeId; use graphene_core::vector::style::Fill; use graphene_core::{Color, MemoHash, Node, Type}; +use graphene_svg_renderer::RenderMetadata; use std::fmt::Display; use std::hash::Hash; use std::marker::PhantomData; diff --git a/node-graph/gstd/Cargo.toml b/node-graph/gstd/Cargo.toml index 9fff8e36c9..ec29d33b68 100644 --- a/node-graph/gstd/Cargo.toml +++ b/node-graph/gstd/Cargo.toml @@ -18,7 +18,7 @@ wasm = [ "image/png", ] image-compare = [] -vello = ["dep:vello", "gpu", "graphene-core/vello"] +vello = ["dep:vello", "gpu"] resvg = [] wayland = ["graph-craft/wayland"] @@ -29,6 +29,7 @@ graph-craft = { workspace = true } wgpu-executor = { workspace = true } graphene-core = { workspace = true } graphene-path-bool = { workspace = true } +graphene-svg-renderer = { workspace = true } graphene-application-io = { workspace = true } # Workspace dependencies diff --git a/node-graph/gstd/src/brush.rs b/node-graph/gstd/src/brush.rs index 58a215a0cd..d85e41e6ea 100644 --- a/node-graph/gstd/src/brush.rs +++ b/node-graph/gstd/src/brush.rs @@ -2,6 +2,7 @@ use crate::raster::{empty_image, extend_image_to_bounds}; use glam::{DAffine2, DVec2}; use graph_craft::generic::FnNode; use graph_craft::proto::FutureWrapperNode; +use graphene_core::bounds::BoundingBox; use graphene_core::instances::Instance; use graphene_core::math::bbox::{AxisAlignedBbox, Bbox}; use graphene_core::raster::adjustments::blend_colors; @@ -9,7 +10,6 @@ use graphene_core::raster::brush_cache::BrushCache; use graphene_core::raster::image::Image; use graphene_core::raster::{Alpha, BitmapMut, BlendMode, Color, Pixel, Sample}; use graphene_core::raster_types::{CPU, Raster, RasterDataTable}; -use graphene_core::renderer::GraphicElementRendered; use graphene_core::transform::Transform; use graphene_core::value::ClonedNode; use graphene_core::vector::brush_stroke::{BrushStroke, BrushStyle}; diff --git a/node-graph/gstd/src/lib.rs b/node-graph/gstd/src/lib.rs index f8384f5471..7fb750ff99 100644 --- a/node-graph/gstd/src/lib.rs +++ b/node-graph/gstd/src/lib.rs @@ -13,3 +13,10 @@ pub use graphene_application_io as application_io; pub use graphene_core::vector; pub use graphene_core::*; pub use graphene_path_bool as path_bool; + +/// stop gap solution until all `Quad` and `Rect` paths have been replaced with their absolute ones +pub mod renderer { + pub use graphene_core::math::quad::Quad; + pub use graphene_core::math::rect::Rect; + pub use graphene_svg_renderer::*; +} diff --git a/node-graph/gstd/src/wasm_application_io.rs b/node-graph/gstd/src/wasm_application_io.rs index 5cd7b4f9ff..82b526f18e 100644 --- a/node-graph/gstd/src/wasm_application_io.rs +++ b/node-graph/gstd/src/wasm_application_io.rs @@ -8,11 +8,11 @@ use graphene_core::instances::Instances; use graphene_core::math::bbox::Bbox; use graphene_core::raster::image::Image; use graphene_core::raster_types::{CPU, Raster, RasterDataTable}; -use graphene_core::renderer::RenderMetadata; -use graphene_core::renderer::{GraphicElementRendered, RenderParams, RenderSvgSegmentList, SvgRender, format_transform_matrix}; use graphene_core::transform::Footprint; use graphene_core::vector::VectorDataTable; use graphene_core::{Color, Context, Ctx, ExtractFootprint, GraphicGroupTable, OwnedContextImpl, WasmNotSend}; +use graphene_svg_renderer::RenderMetadata; +use graphene_svg_renderer::{GraphicElementRendered, RenderParams, RenderSvgSegmentList, SvgRender, format_transform_matrix}; #[cfg(target_arch = "wasm32")] use base64::Engine; diff --git a/node-graph/gsvg-renderer/Cargo.toml b/node-graph/gsvg-renderer/Cargo.toml new file mode 100644 index 0000000000..86b3b14aa2 --- /dev/null +++ b/node-graph/gsvg-renderer/Cargo.toml @@ -0,0 +1,27 @@ +[package] +name = "graphene-svg-renderer" +version = "0.1.0" +edition = "2024" +description = "graphene svg renderer" +authors = ["Graphite Authors "] +license = "MIT OR Apache-2.0" + +[features] +vello = ["dep:vello", "bezier-rs/kurbo"] + +[dependencies] +# Local dependencies +dyn-any = { workspace = true } +graphene-core = { workspace = true } +bezier-rs = { workspace = true } + +# Workspace dependencies +glam = { workspace = true } +serde = { workspace = true } +base64 = { workspace = true } +log = { workspace = true } +num-traits = { workspace = true } +usvg = { workspace = true } + +# Optional workspace dependencies +vello = { workspace = true, optional = true } diff --git a/node-graph/gcore/src/graphic_element/renderer/convert_usvg_path.rs b/node-graph/gsvg-renderer/src/convert_usvg_path.rs similarity index 98% rename from node-graph/gcore/src/graphic_element/renderer/convert_usvg_path.rs rename to node-graph/gsvg-renderer/src/convert_usvg_path.rs index d7f76e8ba5..7ba7688ae0 100644 --- a/node-graph/gcore/src/graphic_element/renderer/convert_usvg_path.rs +++ b/node-graph/gsvg-renderer/src/convert_usvg_path.rs @@ -1,6 +1,6 @@ -use crate::vector::PointId; use bezier_rs::{ManipulatorGroup, Subpath}; use glam::DVec2; +use graphene_core::vector::PointId; pub fn convert_usvg_path(path: &usvg::Path) -> Vec> { let mut subpaths = Vec::new(); diff --git a/node-graph/gsvg-renderer/src/lib.rs b/node-graph/gsvg-renderer/src/lib.rs new file mode 100644 index 0000000000..418f4e9c0c --- /dev/null +++ b/node-graph/gsvg-renderer/src/lib.rs @@ -0,0 +1,6 @@ +pub mod convert_usvg_path; +pub mod render_ext; +mod renderer; +pub mod to_peniko; + +pub use renderer::*; diff --git a/node-graph/gsvg-renderer/src/render_ext.rs b/node-graph/gsvg-renderer/src/render_ext.rs new file mode 100644 index 0000000000..d0d7c16cc8 --- /dev/null +++ b/node-graph/gsvg-renderer/src/render_ext.rs @@ -0,0 +1,278 @@ +use crate::renderer::{RenderParams, format_transform_matrix}; +use glam::{DAffine2, DVec2}; +use graphene_core::consts::{LAYER_OUTLINE_STROKE_COLOR, LAYER_OUTLINE_STROKE_WEIGHT}; +use graphene_core::gradient::{Gradient, GradientType}; +use graphene_core::uuid::generate_uuid; +use graphene_core::vector::style::{Fill, PaintOrder, PathStyle, Stroke, StrokeAlign, StrokeCap, StrokeJoin, ViewMode}; +use std::fmt::Write; + +pub trait RenderExt { + type Output; + fn render( + &self, + svg_defs: &mut String, + element_transform: DAffine2, + stroke_transform: DAffine2, + bounds: [DVec2; 2], + transformed_bounds: [DVec2; 2], + aligned_strokes: bool, + override_paint_order: bool, + render_params: &RenderParams, + ) -> Self::Output; +} + +impl RenderExt for Gradient { + type Output = u64; + + // /// Adds the gradient def through mutating the first argument, returning the gradient ID. + fn render( + &self, + svg_defs: &mut String, + element_transform: DAffine2, + stroke_transform: DAffine2, + bounds: [DVec2; 2], + transformed_bounds: [DVec2; 2], + _aligned_strokes: bool, + _override_paint_order: bool, + _render_params: &RenderParams, + ) -> Self::Output { + // TODO: Figure out how to use `self.transform` as part of the gradient transform, since that field (`Gradient::transform`) is currently never read from, it's only written to. + + let bound_transform = DAffine2::from_scale_angle_translation(bounds[1] - bounds[0], 0., bounds[0]); + let transformed_bound_transform = element_transform * DAffine2::from_scale_angle_translation(transformed_bounds[1] - transformed_bounds[0], 0., transformed_bounds[0]); + + let mut stop = String::new(); + for (position, color) in self.stops.0.iter() { + stop.push_str("") + } + + let mod_gradient = if transformed_bound_transform.matrix2.determinant() != 0. { + transformed_bound_transform.inverse() + } else { + DAffine2::IDENTITY // Ignore if the transform cannot be inverted (the bounds are zero). See issue #1944. + }; + let mod_points = element_transform * stroke_transform * bound_transform; + + let start = mod_points.transform_point2(self.start); + let end = mod_points.transform_point2(self.end); + + let gradient_id = generate_uuid(); + + let matrix = format_transform_matrix(mod_gradient); + let gradient_transform = if matrix.is_empty() { String::new() } else { format!(r#" gradientTransform="{}""#, matrix) }; + + match self.gradient_type { + GradientType::Linear => { + let _ = write!( + svg_defs, + r#"{}"#, + gradient_id, start.x, end.x, start.y, end.y, stop + ); + } + GradientType::Radial => { + let radius = (f64::powi(start.x - end.x, 2) + f64::powi(start.y - end.y, 2)).sqrt(); + let _ = write!( + svg_defs, + r#"{}"#, + gradient_id, start.x, start.y, radius, stop + ); + } + } + + gradient_id + } +} + +impl RenderExt for Fill { + type Output = String; + + /// Renders the fill, adding necessary defs through mutating the first argument. + fn render( + &self, + svg_defs: &mut String, + element_transform: DAffine2, + stroke_transform: DAffine2, + bounds: [DVec2; 2], + transformed_bounds: [DVec2; 2], + aligned_strokes: bool, + override_paint_order: bool, + render_params: &RenderParams, + ) -> Self::Output { + match self { + Self::None => r#" fill="none""#.to_string(), + Self::Solid(color) => { + let mut result = format!(r##" fill="#{}""##, color.to_rgb_hex_srgb_from_gamma()); + if color.a() < 1. { + let _ = write!(result, r#" fill-opacity="{}""#, (color.a() * 1000.).round() / 1000.); + } + result + } + Self::Gradient(gradient) => { + let gradient_id = gradient.render( + svg_defs, + element_transform, + stroke_transform, + bounds, + transformed_bounds, + aligned_strokes, + override_paint_order, + render_params, + ); + format!(r##" fill="url('#{gradient_id}')""##) + } + } + } +} + +impl RenderExt for Stroke { + type Output = String; + + /// Provide the SVG attributes for the stroke. + fn render( + &self, + _svg_defs: &mut String, + _element_transform: DAffine2, + _stroke_transform: DAffine2, + _bounds: [DVec2; 2], + _transformed_bounds: [DVec2; 2], + aligned_strokes: bool, + override_paint_order: bool, + _render_params: &RenderParams, + ) -> Self::Output { + // Don't render a stroke at all if it would be invisible + let Some(color) = self.color else { return String::new() }; + if !self.has_renderable_stroke() { + return String::new(); + } + + // Set to None if the value is the SVG default + let weight = (self.weight != 1.).then_some(self.weight); + let dash_array = (!self.dash_lengths.is_empty()).then_some(self.dash_lengths()); + let dash_offset = (self.dash_offset != 0.).then_some(self.dash_offset); + let stroke_cap = (self.cap != StrokeCap::Butt).then_some(self.cap); + let stroke_join = (self.join != StrokeJoin::Miter).then_some(self.join); + let stroke_join_miter_limit = (self.join_miter_limit != 4.).then_some(self.join_miter_limit); + let stroke_align = (self.align != StrokeAlign::Center).then_some(self.align); + let paint_order = (self.paint_order != PaintOrder::StrokeAbove || override_paint_order).then_some(PaintOrder::StrokeBelow); + + // Render the needed stroke attributes + let mut attributes = format!(r##" stroke="#{}""##, color.to_rgb_hex_srgb_from_gamma()); + if color.a() < 1. { + let _ = write!(&mut attributes, r#" stroke-opacity="{}""#, (color.a() * 1000.).round() / 1000.); + } + if let Some(mut weight) = weight { + if stroke_align.is_some() && aligned_strokes { + weight *= 2.; + } + let _ = write!(&mut attributes, r#" stroke-width="{}""#, weight); + } + if let Some(dash_array) = dash_array { + let _ = write!(&mut attributes, r#" stroke-dasharray="{}""#, dash_array); + } + if let Some(dash_offset) = dash_offset { + let _ = write!(&mut attributes, r#" stroke-dashoffset="{}""#, dash_offset); + } + if let Some(stroke_cap) = stroke_cap { + let _ = write!(&mut attributes, r#" stroke-linecap="{}""#, stroke_cap.svg_name()); + } + if let Some(stroke_join) = stroke_join { + let _ = write!(&mut attributes, r#" stroke-linejoin="{}""#, stroke_join.svg_name()); + } + if let Some(stroke_join_miter_limit) = stroke_join_miter_limit { + let _ = write!(&mut attributes, r#" stroke-miterlimit="{}""#, stroke_join_miter_limit); + } + // Add vector-effect attribute to make strokes non-scaling + if self.non_scaling { + let _ = write!(&mut attributes, r#" vector-effect="non-scaling-stroke""#); + } + if paint_order.is_some() { + let _ = write!(&mut attributes, r#" style="paint-order: stroke;" "#); + } + attributes + } +} + +impl RenderExt for PathStyle { + type Output = String; + + /// Renders the shape's fill and stroke attributes as a string with them concatenated together. + #[allow(clippy::too_many_arguments)] + fn render( + &self, + svg_defs: &mut String, + element_transform: DAffine2, + stroke_transform: DAffine2, + bounds: [DVec2; 2], + transformed_bounds: [DVec2; 2], + aligned_strokes: bool, + override_paint_order: bool, + render_params: &RenderParams, + ) -> String { + let view_mode = render_params.view_mode; + match view_mode { + ViewMode::Outline => { + let fill_attribute = Fill::None.render( + svg_defs, + element_transform, + stroke_transform, + bounds, + transformed_bounds, + aligned_strokes, + override_paint_order, + render_params, + ); + let mut outline_stroke = Stroke::new(Some(LAYER_OUTLINE_STROKE_COLOR), LAYER_OUTLINE_STROKE_WEIGHT); + // Outline strokes should be non-scaling by default + outline_stroke.non_scaling = true; + let stroke_attribute = outline_stroke.render( + svg_defs, + element_transform, + stroke_transform, + bounds, + transformed_bounds, + aligned_strokes, + override_paint_order, + render_params, + ); + format!("{fill_attribute}{stroke_attribute}") + } + _ => { + let fill_attribute = self.fill.render( + svg_defs, + element_transform, + stroke_transform, + bounds, + transformed_bounds, + aligned_strokes, + override_paint_order, + render_params, + ); + let stroke_attribute = self + .stroke + .as_ref() + .map(|stroke| { + stroke.render( + svg_defs, + element_transform, + stroke_transform, + bounds, + transformed_bounds, + aligned_strokes, + override_paint_order, + render_params, + ) + }) + .unwrap_or_default(); + format!("{fill_attribute}{stroke_attribute}") + } + } + } +} diff --git a/node-graph/gcore/src/graphic_element/renderer.rs b/node-graph/gsvg-renderer/src/renderer.rs similarity index 89% rename from node-graph/gcore/src/graphic_element/renderer.rs rename to node-graph/gsvg-renderer/src/renderer.rs index e7a243808b..a1759f23e2 100644 --- a/node-graph/gcore/src/graphic_element/renderer.rs +++ b/node-graph/gsvg-renderer/src/renderer.rs @@ -1,19 +1,21 @@ -pub mod convert_usvg_path; - -use crate::instances::Instance; -pub use crate::math::quad::Quad; -pub use crate::math::rect::Rect; -use crate::raster::{BlendMode, Image}; -use crate::raster_types::{CPU, GPU, RasterDataTable}; -use crate::transform::{Footprint, Transform}; -use crate::uuid::{NodeId, generate_uuid}; -use crate::vector::VectorDataTable; -use crate::vector::click_target::{ClickTarget, FreePoint}; -use crate::vector::style::{Fill, Stroke, StrokeAlign, ViewMode}; -use crate::{Artboard, ArtboardGroupTable, Color, GraphicElement, GraphicGroupTable}; +use crate::render_ext::RenderExt; +use crate::to_peniko::BlendModeExt; use bezier_rs::Subpath; use dyn_any::DynAny; use glam::{DAffine2, DVec2}; +use graphene_core::blending::BlendMode; +use graphene_core::bounds::BoundingBox; +use graphene_core::color::Color; +use graphene_core::instances::Instance; +use graphene_core::math::quad::Quad; +use graphene_core::raster::Image; +use graphene_core::raster_types::{CPU, GPU, RasterDataTable}; +use graphene_core::transform::{Footprint, Transform}; +use graphene_core::uuid::{NodeId, generate_uuid}; +use graphene_core::vector::VectorDataTable; +use graphene_core::vector::click_target::{ClickTarget, FreePoint}; +use graphene_core::vector::style::{Fill, Stroke, StrokeAlign, ViewMode}; +use graphene_core::{AlphaBlending, Artboard, ArtboardGroupTable, GraphicElement, GraphicGroupTable}; use num_traits::Zero; use std::collections::{HashMap, HashSet}; use std::fmt::Write; @@ -201,12 +203,11 @@ pub struct RenderMetadata { } // TODO: Rename to "Graphical" -pub trait GraphicElementRendered { +pub trait GraphicElementRendered: BoundingBox { fn render_svg(&self, render: &mut SvgRender, render_params: &RenderParams); #[cfg(feature = "vello")] fn render_to_vello(&self, scene: &mut Scene, transform: DAffine2, context: &mut RenderContext, _render_params: &RenderParams); - fn bounding_box(&self, transform: DAffine2, include_stroke: bool) -> Option<[DVec2; 2]>; /// The upstream click targets for each layer are collected during the render so that they do not have to be calculated for each click detection. fn add_upstream_click_targets(&self, _click_targets: &mut Vec) {} @@ -222,10 +223,6 @@ pub trait GraphicElementRendered { } fn new_ids_from_hash(&mut self, _reference: Option) {} - - fn to_graphic_element(&self) -> GraphicElement { - GraphicElement::default() - } } impl GraphicElementRendered for GraphicGroupTable { @@ -299,7 +296,7 @@ impl GraphicElementRendered for GraphicGroupTable { if let Some(bounds) = bounds { let blend_mode = match render_params.view_mode { ViewMode::Outline => peniko::Mix::Normal, - _ => alpha_blending.blend_mode.into(), + _ => alpha_blending.blend_mode.to_peniko(), }; let factor = if render_params.for_mask { 1. } else { alpha_blending.fill }; @@ -326,7 +323,7 @@ impl GraphicElementRendered for GraphicGroupTable { } if let Some(bounds) = bounds { - let rect = vello::kurbo::Rect::new(bounds[0].x, bounds[0].y, bounds[1].x, bounds[1].y); + let rect = kurbo::Rect::new(bounds[0].x, bounds[0].y, bounds[1].x, bounds[1].y); scene.push_layer(peniko::Mix::Normal, 1., kurbo::Affine::IDENTITY, &rect); instance_mask.render_to_vello(scene, transform_mask, context, &render_params.for_clipper()); @@ -349,12 +346,6 @@ impl GraphicElementRendered for GraphicGroupTable { } } - fn bounding_box(&self, transform: DAffine2, include_stroke: bool) -> Option<[DVec2; 2]> { - self.instance_ref_iter() - .filter_map(|element| element.instance.bounding_box(transform * *element.transform, include_stroke)) - .reduce(Quad::combine_bounds) - } - fn collect_metadata(&self, metadata: &mut RenderMetadata, footprint: Footprint, element_id: Option) { for instance in self.instance_ref_iter() { if let Some(element_id) = instance.source_node_id { @@ -406,10 +397,6 @@ impl GraphicElementRendered for GraphicGroupTable { instance.instance.new_ids_from_hash(*instance.source_node_id); } } - - fn to_graphic_element(&self) -> GraphicElement { - GraphicElement::GraphicGroup(self.clone()) - } } impl GraphicElementRendered for VectorDataTable { @@ -519,8 +506,8 @@ impl GraphicElementRendered for VectorDataTable { #[cfg(feature = "vello")] fn render_to_vello(&self, scene: &mut Scene, parent_transform: DAffine2, _context: &mut RenderContext, render_params: &RenderParams) { - use crate::consts::{LAYER_OUTLINE_STROKE_COLOR, LAYER_OUTLINE_STROKE_WEIGHT}; - use crate::vector::style::{GradientType, StrokeCap, StrokeJoin}; + use graphene_core::consts::{LAYER_OUTLINE_STROKE_COLOR, LAYER_OUTLINE_STROKE_WEIGHT}; + use graphene_core::vector::style::{GradientType, StrokeCap, StrokeJoin}; use vello::kurbo::{Cap, Join}; use vello::peniko; @@ -543,7 +530,7 @@ impl GraphicElementRendered for VectorDataTable { // If we're using opacity or a blend mode, we need to push a layer let blend_mode = match render_params.view_mode { ViewMode::Outline => peniko::Mix::Normal, - _ => instance.alpha_blending.blend_mode.into(), + _ => instance.alpha_blending.blend_mode.to_peniko(), }; let mut layer = false; let factor = if render_params.for_mask { 1. } else { instance.alpha_blending.fill }; @@ -582,7 +569,7 @@ impl GraphicElementRendered for VectorDataTable { let weight = instance.instance.style.stroke().unwrap().weight; let quad = Quad::from_box(layer_bounds).inflate(weight * element_transform.matrix2.determinant()); - let rect = vello::kurbo::Rect::new(quad.top_left().x, quad.top_left().y, quad.bottom_right().x, quad.bottom_right().y); + let rect = kurbo::Rect::new(quad.top_left().x, quad.top_left().y, quad.bottom_right().x, quad.bottom_right().y); let inside = instance.instance.style.stroke().unwrap().align == StrokeAlign::Inside; let compose = if inside { peniko::Compose::SrcIn } else { peniko::Compose::SrcOut }; @@ -725,27 +712,6 @@ impl GraphicElementRendered for VectorDataTable { } } - fn bounding_box(&self, transform: DAffine2, include_stroke: bool) -> Option<[DVec2; 2]> { - self.instance_ref_iter() - .flat_map(|instance| { - if !include_stroke { - return instance.instance.bounding_box_with_transform(transform * *instance.transform); - } - - let stroke_width = instance.instance.style.stroke().map(|s| s.weight()).unwrap_or_default(); - - let miter_limit = instance.instance.style.stroke().map(|s| s.join_miter_limit).unwrap_or(1.); - - let scale = transform.decompose_scale(); - - // We use the full line width here to account for different styles of stroke caps - let offset = DVec2::splat(stroke_width * scale.x.max(scale.y) * miter_limit); - - instance.instance.bounding_box_with_transform(transform * *instance.transform).map(|[a, b]| [a - offset, b + offset]) - }) - .reduce(Quad::combine_bounds) - } - fn collect_metadata(&self, metadata: &mut RenderMetadata, mut footprint: Footprint, element_id: Option) { for instance in self.instance_ref_iter() { let instance_transform = *instance.transform; @@ -828,10 +794,6 @@ impl GraphicElementRendered for VectorDataTable { instance.instance.vector_new_ids_from_hash(reference.map(|id| id.0).unwrap_or_default()); } } - - fn to_graphic_element(&self) -> GraphicElement { - GraphicElement::VectorData(self.clone()) - } } impl GraphicElementRendered for Artboard { @@ -906,18 +868,6 @@ impl GraphicElementRendered for Artboard { } } - fn bounding_box(&self, transform: DAffine2, include_stroke: bool) -> Option<[DVec2; 2]> { - let artboard_bounds = (transform * Quad::from_box([self.location.as_dvec2(), self.location.as_dvec2() + self.dimensions.as_dvec2()])).bounding_box(); - if self.clip { - Some(artboard_bounds) - } else { - [self.graphic_group.bounding_box(transform, include_stroke), Some(artboard_bounds)] - .into_iter() - .flatten() - .reduce(Quad::combine_bounds) - } - } - fn collect_metadata(&self, metadata: &mut RenderMetadata, mut footprint: Footprint, element_id: Option) { if let Some(element_id) = element_id { let subpath = Subpath::new_rect(DVec2::ZERO, self.dimensions.as_dvec2()); @@ -956,12 +906,6 @@ impl GraphicElementRendered for ArtboardGroupTable { } } - fn bounding_box(&self, transform: DAffine2, include_stroke: bool) -> Option<[DVec2; 2]> { - self.instance_ref_iter() - .filter_map(|instance| instance.instance.bounding_box(transform, include_stroke)) - .reduce(Quad::combine_bounds) - } - fn collect_metadata(&self, metadata: &mut RenderMetadata, footprint: Footprint, _element_id: Option) { for instance in self.instance_ref_iter() { instance.instance.collect_metadata(metadata, footprint, *instance.source_node_id); @@ -1036,15 +980,6 @@ impl GraphicElementRendered for RasterDataTable { } } - fn bounding_box(&self, transform: DAffine2, _include_stroke: bool) -> Option<[DVec2; 2]> { - self.instance_ref_iter() - .flat_map(|instance| { - let transform = transform * *instance.transform; - (transform.matrix2.determinant() != 0.).then(|| (transform * Quad::from_box([DVec2::ZERO, DVec2::ONE])).bounding_box()) - }) - .reduce(Quad::combine_bounds) - } - fn collect_metadata(&self, metadata: &mut RenderMetadata, footprint: Footprint, element_id: Option) { let Some(element_id) = element_id else { return }; let subpath = Subpath::new_rect(DVec2::ZERO, DVec2::ONE); @@ -1061,10 +996,6 @@ impl GraphicElementRendered for RasterDataTable { let subpath = Subpath::new_rect(DVec2::ZERO, DVec2::ONE); click_targets.push(ClickTarget::new_with_subpath(subpath, 0.)); } - - fn to_graphic_element(&self) -> GraphicElement { - GraphicElement::RasterDataCPU(self.clone()) - } } impl GraphicElementRendered for RasterDataTable { @@ -1076,25 +1007,25 @@ impl GraphicElementRendered for RasterDataTable { fn render_to_vello(&self, scene: &mut Scene, transform: DAffine2, context: &mut RenderContext, _render_params: &RenderParams) { use vello::peniko; - let mut render_stuff = |image: vello::peniko::Image, instance_transform: DAffine2, blend_mode: crate::AlphaBlending| { + let mut render_stuff = |image: peniko::Image, instance_transform: DAffine2, blend_mode: AlphaBlending| { let image_transform = transform * instance_transform * DAffine2::from_scale(1. / DVec2::new(image.width as f64, image.height as f64)); let layer = blend_mode != Default::default(); let Some(bounds) = self.bounding_box(transform, true) else { return }; - let blending = vello::peniko::BlendMode::new(blend_mode.blend_mode.into(), vello::peniko::Compose::SrcOver); + let blending = peniko::BlendMode::new(blend_mode.blend_mode.to_peniko(), peniko::Compose::SrcOver); if layer { - let rect = vello::kurbo::Rect::new(bounds[0].x, bounds[0].y, bounds[1].x, bounds[1].y); + let rect = kurbo::Rect::new(bounds[0].x, bounds[0].y, bounds[1].x, bounds[1].y); scene.push_layer(blending, blend_mode.opacity, kurbo::Affine::IDENTITY, &rect); } - scene.draw_image(&image, vello::kurbo::Affine::new(image_transform.to_cols_array())); + scene.draw_image(&image, kurbo::Affine::new(image_transform.to_cols_array())); if layer { scene.pop_layer() } }; for instance in self.instance_ref_iter() { - let image = vello::peniko::Image::new(vec![].into(), peniko::Format::Rgba8, instance.instance.data().width(), instance.instance.data().height()).with_extend(peniko::Extend::Repeat); + let image = peniko::Image::new(vec![].into(), peniko::Format::Rgba8, instance.instance.data().width(), instance.instance.data().height()).with_extend(peniko::Extend::Repeat); let id = image.data.id(); context.resource_overrides.insert(id, instance.instance.data_owned()); @@ -1103,15 +1034,6 @@ impl GraphicElementRendered for RasterDataTable { } } - fn bounding_box(&self, transform: DAffine2, _include_stroke: bool) -> Option<[DVec2; 2]> { - self.instance_ref_iter() - .flat_map(|instance| { - let transform = transform * *instance.transform; - (transform.matrix2.determinant() != 0.).then(|| (transform * Quad::from_box([DVec2::ZERO, DVec2::ONE])).bounding_box()) - }) - .reduce(Quad::combine_bounds) - } - fn collect_metadata(&self, metadata: &mut RenderMetadata, footprint: Footprint, element_id: Option) { let Some(element_id) = element_id else { return }; let subpath = Subpath::new_rect(DVec2::ZERO, DVec2::ONE); @@ -1150,15 +1072,6 @@ impl GraphicElementRendered for GraphicElement { } } - fn bounding_box(&self, transform: DAffine2, include_stroke: bool) -> Option<[DVec2; 2]> { - match self { - GraphicElement::VectorData(vector_data) => vector_data.bounding_box(transform, include_stroke), - GraphicElement::RasterDataCPU(raster) => raster.bounding_box(transform, include_stroke), - GraphicElement::RasterDataGPU(raster) => raster.bounding_box(transform, include_stroke), - GraphicElement::GraphicGroup(graphic_group) => graphic_group.bounding_box(transform, include_stroke), - } - } - fn collect_metadata(&self, metadata: &mut RenderMetadata, footprint: Footprint, element_id: Option) { if let Some(element_id) = element_id { match self { @@ -1228,7 +1141,7 @@ impl GraphicElementRendered for GraphicElement { } /// Used to stop rust complaining about upstream traits adding display implementations to `Option`. This would not be an issue as we control that crate. -trait Primitive: std::fmt::Display {} +trait Primitive: std::fmt::Display + BoundingBox {} impl Primitive for String {} impl Primitive for bool {} impl Primitive for f32 {} @@ -1246,10 +1159,6 @@ impl GraphicElementRendered for P { render.parent_tag("text", text_attributes, |render| render.leaf_node(format!("{self}"))); } - fn bounding_box(&self, _transform: DAffine2, _include_stroke: bool) -> Option<[DVec2; 2]> { - None - } - #[cfg(feature = "vello")] fn render_to_vello(&self, _scene: &mut Scene, _transform: DAffine2, _context: &mut RenderContext, _render_params: &RenderParams) {} } @@ -1274,10 +1183,6 @@ impl GraphicElementRendered for Option { render.parent_tag("text", text_attributes, |render| render.leaf_node(color_info)) } - fn bounding_box(&self, _transform: DAffine2, _include_stroke: bool) -> Option<[DVec2; 2]> { - None - } - #[cfg(feature = "vello")] fn render_to_vello(&self, _scene: &mut Scene, _transform: DAffine2, _context: &mut RenderContext, _render_params: &RenderParams) {} } @@ -1298,10 +1203,6 @@ impl GraphicElementRendered for Vec { } } - fn bounding_box(&self, _transform: DAffine2, _include_stroke: bool) -> Option<[DVec2; 2]> { - None - } - #[cfg(feature = "vello")] fn render_to_vello(&self, _scene: &mut Scene, _transform: DAffine2, _context: &mut RenderContext, _render_params: &RenderParams) {} } diff --git a/node-graph/gsvg-renderer/src/to_peniko.rs b/node-graph/gsvg-renderer/src/to_peniko.rs new file mode 100644 index 0000000000..4ee3e50452 --- /dev/null +++ b/node-graph/gsvg-renderer/src/to_peniko.rs @@ -0,0 +1,38 @@ +use graphene_core::BlendMode; +use vello::peniko; + +#[cfg(feature = "vello")] +pub trait BlendModeExt { + fn to_peniko(&self) -> peniko::Mix; +} + +#[cfg(feature = "vello")] +impl BlendModeExt for BlendMode { + fn to_peniko(&self) -> peniko::Mix { + match self { + // Normal group + BlendMode::Normal => peniko::Mix::Normal, + // Darken group + BlendMode::Darken => peniko::Mix::Darken, + BlendMode::Multiply => peniko::Mix::Multiply, + BlendMode::ColorBurn => peniko::Mix::ColorBurn, + // Lighten group + BlendMode::Lighten => peniko::Mix::Lighten, + BlendMode::Screen => peniko::Mix::Screen, + BlendMode::ColorDodge => peniko::Mix::ColorDodge, + // Contrast group + BlendMode::Overlay => peniko::Mix::Overlay, + BlendMode::SoftLight => peniko::Mix::SoftLight, + BlendMode::HardLight => peniko::Mix::HardLight, + // Inversion group + BlendMode::Difference => peniko::Mix::Difference, + BlendMode::Exclusion => peniko::Mix::Exclusion, + // Component group + BlendMode::Hue => peniko::Mix::Hue, + BlendMode::Saturation => peniko::Mix::Saturation, + BlendMode::Color => peniko::Mix::Color, + BlendMode::Luminosity => peniko::Mix::Luminosity, + _ => todo!(), + } + } +} diff --git a/node-graph/wgpu-executor/Cargo.toml b/node-graph/wgpu-executor/Cargo.toml index 7eb1c31a8f..e939abd8cf 100644 --- a/node-graph/wgpu-executor/Cargo.toml +++ b/node-graph/wgpu-executor/Cargo.toml @@ -11,8 +11,9 @@ passthrough = [] [dependencies] # Local dependencies -graphene-core = { workspace = true, features = ["wgpu", "vello"] } +graphene-core = { workspace = true, features = ["wgpu"] } graphene-application-io = { workspace = true, features = ["wgpu"] } +graphene-svg-renderer = { workspace = true, features = ["vello"] } dyn-any = { workspace = true } node-macro = { workspace = true } diff --git a/node-graph/wgpu-executor/src/lib.rs b/node-graph/wgpu-executor/src/lib.rs index 948cfd5d1b..d65c24814a 100644 --- a/node-graph/wgpu-executor/src/lib.rs +++ b/node-graph/wgpu-executor/src/lib.rs @@ -6,6 +6,7 @@ use dyn_any::StaticType; use glam::UVec2; use graphene_application_io::{ApplicationIo, EditorApi, SurfaceHandle}; use graphene_core::{Color, Ctx}; +pub use graphene_svg_renderer::RenderContext; use std::sync::Arc; use vello::{AaConfig, AaSupport, RenderParams, Renderer, RendererOptions, Scene}; use wgpu::{Origin3d, SurfaceConfiguration, TextureAspect}; @@ -50,8 +51,6 @@ unsafe impl StaticType for Surface { type Static = Surface; } -pub use graphene_core::renderer::RenderContext; - impl WgpuExecutor { pub async fn render_vello_scene(&self, scene: &Scene, surface: &WgpuSurface, width: u32, height: u32, context: &RenderContext, background: Color) -> Result<()> { let surface = &surface.surface.inner; From ecd7999ca7994a8913f18c25a6bbf62eb69c4853 Mon Sep 17 00:00:00 2001 From: Firestar99 Date: Sat, 28 Jun 2025 00:04:24 +0200 Subject: [PATCH 32/44] Extract `gmath_nodes` from `gcore::ops`, create mods `debug` and `extract_xy` (#2764) --- Cargo.lock | 14 +- Cargo.toml | 3 + .../node_graph/document_node_definitions.rs | 2 +- .../document/node_graph/node_properties.rs | 4 +- .../messages/portfolio/document_migration.rs | 45 ++ node-graph/gcore/Cargo.toml | 3 - node-graph/gcore/src/debug.rs | 26 + node-graph/gcore/src/extract_xy.rs | 21 + node-graph/gcore/src/lib.rs | 2 + node-graph/gcore/src/ops.rs | 571 +----------------- .../gcore/src/vector/algorithms/instance.rs | 4 +- node-graph/gmath-nodes/Cargo.toml | 17 + node-graph/gmath-nodes/src/lib.rs | 532 ++++++++++++++++ node-graph/graph-craft/src/document/value.rs | 2 +- node-graph/gstd/Cargo.toml | 1 + node-graph/gstd/src/lib.rs | 1 + 16 files changed, 668 insertions(+), 580 deletions(-) create mode 100644 node-graph/gcore/src/debug.rs create mode 100644 node-graph/gcore/src/extract_xy.rs create mode 100644 node-graph/gmath-nodes/Cargo.toml create mode 100644 node-graph/gmath-nodes/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 04c0788ed4..c7ae0cdb13 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2197,7 +2197,6 @@ dependencies = [ "image", "kurbo", "log", - "math-parser", "node-macro", "num-derive", "num-traits", @@ -2214,6 +2213,18 @@ dependencies = [ "wgpu", ] +[[package]] +name = "graphene-math-nodes" +version = "0.1.0" +dependencies = [ + "glam", + "graphene-core", + "log", + "math-parser", + "node-macro", + "rand 0.9.0", +] + [[package]] name = "graphene-path-bool" version = "0.1.0" @@ -2242,6 +2253,7 @@ dependencies = [ "graph-craft", "graphene-application-io", "graphene-core", + "graphene-math-nodes", "graphene-path-bool", "graphene-svg-renderer", "image", diff --git a/Cargo.toml b/Cargo.toml index 27e5613a95..56c27ce6fe 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,7 @@ members = [ "node-graph/gapplication-io", "node-graph/gcore", "node-graph/gstd", + "node-graph/gmath-nodes", "node-graph/gpath-bool", "node-graph/graph-craft", "node-graph/graphene-cli", @@ -25,6 +26,7 @@ default-members = [ "frontend/wasm", "node-graph/gcore", "node-graph/gstd", + "node-graph/gmath-nodes", "node-graph/gpath-bool", "node-graph/graph-craft", "node-graph/graphene-cli", @@ -43,6 +45,7 @@ math-parser = { path = "libraries/math-parser" } path-bool = { path = "libraries/path-bool" } graphene-application-io = { path = "node-graph/gapplication-io" } graphene-core = { path = "node-graph/gcore" } +graphene-math-nodes = { path = "node-graph/gmath-nodes" } graphene-path-bool = { path = "node-graph/gpath-bool" } graph-craft = { path = "node-graph/graph-craft" } graphene-std = { path = "node-graph/gstd" } diff --git a/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs b/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs index c6276e4109..b9b04a2436 100644 --- a/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs +++ b/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs @@ -16,7 +16,7 @@ use graph_craft::ProtoNodeIdentifier; use graph_craft::concrete; use graph_craft::document::value::*; use graph_craft::document::*; -use graphene_std::ops::XY; +use graphene_std::extract_xy::XY; use graphene_std::raster::brush_cache::BrushCache; use graphene_std::raster::{CellularDistanceFunction, CellularReturnType, Color, DomainWarpType, FractalType, NoiseType, RedGreenBlueAlpha}; use graphene_std::raster_types::{CPU, RasterDataTable}; diff --git a/editor/src/messages/portfolio/document/node_graph/node_properties.rs b/editor/src/messages/portfolio/document/node_graph/node_properties.rs index 44b91fc4ce..d074781c14 100644 --- a/editor/src/messages/portfolio/document/node_graph/node_properties.rs +++ b/editor/src/messages/portfolio/document/node_graph/node_properties.rs @@ -12,7 +12,7 @@ use graph_craft::Type; use graph_craft::document::value::TaggedValue; use graph_craft::document::{DocumentNode, DocumentNodeImplementation, NodeId, NodeInput}; use graphene_std::animation::RealTimeMode; -use graphene_std::ops::XY; +use graphene_std::extract_xy::XY; use graphene_std::path_bool::BooleanOperation; use graphene_std::raster::curve::Curve; use graphene_std::raster::{ @@ -1840,7 +1840,7 @@ pub fn offset_path_properties(node_id: NodeId, context: &mut NodePropertiesConte } pub fn math_properties(node_id: NodeId, context: &mut NodePropertiesContext) -> Vec { - use graphene_std::ops::math::*; + use graphene_std::math_nodes::math::*; let document_node = match get_document_node(node_id, context) { Ok(document_node) => document_node, diff --git a/editor/src/messages/portfolio/document_migration.rs b/editor/src/messages/portfolio/document_migration.rs index 867d38da18..e8724966c1 100644 --- a/editor/src/messages/portfolio/document_migration.rs +++ b/editor/src/messages/portfolio/document_migration.rs @@ -24,6 +24,51 @@ const REPLACEMENTS: &[(&str, &str)] = &[ ("graphene_core::ConstructArtboardNode", "graphene_core::graphic_element::ToArtboardNode"), ("graphene_core::ToGraphicElementNode", "graphene_core::graphic_element::ToElementNode"), ("graphene_core::ToGraphicGroupNode", "graphene_core::graphic_element::ToGroupNode"), + ("graphene_core::ops::MathNode", "graphene_math_nodes::MathNode"), + ("graphene_core::ops::AddNode", "graphene_math_nodes::AddNode"), + ("graphene_core::ops::SubtractNode", "graphene_math_nodes::SubtractNode"), + ("graphene_core::ops::MultiplyNode", "graphene_math_nodes::MultiplyNode"), + ("graphene_core::ops::DivideNode", "graphene_math_nodes::DivideNode"), + ("graphene_core::ops::ModuloNode", "graphene_math_nodes::ModuloNode"), + ("graphene_core::ops::ExponentNode", "graphene_math_nodes::ExponentNode"), + ("graphene_core::ops::RootNode", "graphene_math_nodes::RootNode"), + ("graphene_core::ops::LogarithmNode", "graphene_math_nodes::LogarithmNode"), + ("graphene_core::ops::SineNode", "graphene_math_nodes::SineNode"), + ("graphene_core::ops::CosineNode", "graphene_math_nodes::CosineNode"), + ("graphene_core::ops::TangentNode", "graphene_math_nodes::TangentNode"), + ("graphene_core::ops::SineInverseNode", "graphene_math_nodes::SineInverseNode"), + ("graphene_core::ops::CosineInverseNode", "graphene_math_nodes::CosineInverseNode"), + ("graphene_core::ops::TangentInverseNode", "graphene_math_nodes::TangentInverseNode"), + ("graphene_core::ops::RandomNode", "graphene_math_nodes::RandomNode"), + ("graphene_core::ops::ToU32Node", "graphene_math_nodes::ToU32Node"), + ("graphene_core::ops::ToU64Node", "graphene_math_nodes::ToU64Node"), + ("graphene_core::ops::ToF64Node", "graphene_math_nodes::ToF64Node"), + ("graphene_core::ops::RoundNode", "graphene_math_nodes::RoundNode"), + ("graphene_core::ops::FloorNode", "graphene_math_nodes::FloorNode"), + ("graphene_core::ops::CeilingNode", "graphene_math_nodes::CeilingNode"), + ("graphene_core::ops::MinNode", "graphene_math_nodes::MinNode"), + ("graphene_core::ops::MaxNode", "graphene_math_nodes::MaxNode"), + ("graphene_core::ops::ClampNode", "graphene_math_nodes::ClampNode"), + ("graphene_core::ops::EqualsNode", "graphene_math_nodes::EqualsNode"), + ("graphene_core::ops::NotEqualsNode", "graphene_math_nodes::NotEqualsNode"), + ("graphene_core::ops::LessThanNode", "graphene_math_nodes::LessThanNode"), + ("graphene_core::ops::GreaterThanNode", "graphene_math_nodes::GreaterThanNode"), + ("graphene_core::ops::LogicalOrNode", "graphene_math_nodes::LogicalOrNode"), + ("graphene_core::ops::LogicalAndNode", "graphene_math_nodes::LogicalAndNode"), + ("graphene_core::ops::LogicalNotNode", "graphene_math_nodes::LogicalNotNode"), + ("graphene_core::ops::BoolValueNode", "graphene_math_nodes::BoolValueNode"), + ("graphene_core::ops::NumberValueNode", "graphene_math_nodes::NumberValueNode"), + ("graphene_core::ops::PercentageValueNode", "graphene_math_nodes::PercentageValueNode"), + ("graphene_core::ops::CoordinateValueNode", "graphene_math_nodes::CoordinateValueNode"), + ("graphene_core::ops::ColorValueNode", "graphene_math_nodes::ColorValueNode"), + ("graphene_core::ops::GradientValueNode", "graphene_math_nodes::GradientValueNode"), + ("graphene_core::ops::StringValueNode", "graphene_math_nodes::StringValueNode"), + ("graphene_core::ops::DotProductNode", "graphene_math_nodes::DotProductNode"), + ("graphene_core::ops::SizeOfNode", "graphene_core::debug::SizeOfNode"), + ("graphene_core::ops::SomeNode", "graphene_core::debug::SomeNode"), + ("graphene_core::ops::UnwrapNode", "graphene_core::debug::UnwrapNode"), + ("graphene_core::ops::CloneNode", "graphene_core::debug::CloneNode"), + ("graphene_core::ops::ExtractXyNode", "graphene_core::extract_xy::ExtractXyNode"), ("graphene_core::logic::LogicAndNode", "graphene_core::ops::LogicAndNode"), ("graphene_core::logic::LogicNotNode", "graphene_core::ops::LogicNotNode"), ("graphene_core::logic::LogicOrNode", "graphene_core::ops::LogicOrNode"), diff --git a/node-graph/gcore/Cargo.toml b/node-graph/gcore/Cargo.toml index 07daf7933b..9d7a9dde3b 100644 --- a/node-graph/gcore/Cargo.toml +++ b/node-graph/gcore/Cargo.toml @@ -14,9 +14,6 @@ wgpu = ["dep:wgpu"] dealloc_nodes = [] [dependencies] -# Local dependencies -math-parser = { workspace = true } - # Workspace dependencies bytemuck = { workspace = true } node-macro = { workspace = true } diff --git a/node-graph/gcore/src/debug.rs b/node-graph/gcore/src/debug.rs new file mode 100644 index 0000000000..b88ed1c8e3 --- /dev/null +++ b/node-graph/gcore/src/debug.rs @@ -0,0 +1,26 @@ +use crate::raster_types::{CPU, RasterDataTable}; +use crate::{Color, Ctx}; + +/// Meant for debugging purposes, not general use. Returns the size of the input type in bytes. +#[node_macro::node(category("Debug"))] +fn size_of(_: impl Ctx, ty: crate::Type) -> Option { + ty.size() +} + +/// Meant for debugging purposes, not general use. Wraps the input value in the Some variant of an Option. +#[node_macro::node(category("Debug"))] +fn some(_: impl Ctx, #[implementations(f64, f32, u32, u64, String, Color)] input: T) -> Option { + Some(input) +} + +/// Meant for debugging purposes, not general use. Unwraps the input value from an Option, returning the default value if the input is None. +#[node_macro::node(category("Debug"))] +fn unwrap(_: impl Ctx, #[implementations(Option, Option, Option, Option, Option, Option)] input: Option) -> T { + input.unwrap_or_default() +} + +/// Meant for debugging purposes, not general use. Clones the input value. +#[node_macro::node(category("Debug"))] +fn clone<'i, T: Clone + 'i>(_: impl Ctx, #[implementations(&RasterDataTable)] value: &'i T) -> T { + value.clone() +} diff --git a/node-graph/gcore/src/extract_xy.rs b/node-graph/gcore/src/extract_xy.rs new file mode 100644 index 0000000000..41e084e01f --- /dev/null +++ b/node-graph/gcore/src/extract_xy.rs @@ -0,0 +1,21 @@ +use crate::Ctx; +use dyn_any::DynAny; +use glam::{DVec2, IVec2, UVec2}; + +/// Obtain the X or Y component of a coordinate. +#[node_macro::node(name("Extract XY"), category("Math: Vector"))] +fn extract_xy>(_: impl Ctx, #[implementations(DVec2, IVec2, UVec2)] vector: T, axis: XY) -> f64 { + match axis { + XY::X => vector.into().x, + XY::Y => vector.into().y, + } +} + +/// The X or Y component of a coordinate. +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, DynAny, node_macro::ChoiceType, specta::Type, serde::Serialize, serde::Deserialize)] +#[widget(Dropdown)] +pub enum XY { + #[default] + X, + Y, +} diff --git a/node-graph/gcore/src/lib.rs b/node-graph/gcore/src/lib.rs index 9c47ea6fdd..973b2f4d24 100644 --- a/node-graph/gcore/src/lib.rs +++ b/node-graph/gcore/src/lib.rs @@ -8,6 +8,8 @@ pub mod bounds; pub mod color; pub mod consts; pub mod context; +pub mod debug; +pub mod extract_xy; pub mod generic; pub mod gradient; mod graphic_element; diff --git a/node-graph/gcore/src/ops.rs b/node-graph/gcore/src/ops.rs index 6b968ab242..2e4b1b3202 100644 --- a/node-graph/gcore/src/ops.rs +++ b/node-graph/gcore/src/ops.rs @@ -1,511 +1,5 @@ -use crate::Ctx; -use crate::raster_types::{CPU, RasterDataTable}; -use crate::registry::types::{Fraction, Percentage}; -use crate::vector::style::GradientStops; -use crate::{Color, Node}; -use dyn_any::DynAny; -use glam::{DVec2, IVec2, UVec2}; -use math_parser::ast; -use math_parser::context::{EvalContext, NothingMap, ValueProvider}; -use math_parser::value::{Number, Value}; -use num_traits::Pow; -use rand::{Rng, SeedableRng}; +use crate::Node; use std::marker::PhantomData; -use std::ops::{Add, Div, Mul, Rem, Sub}; - -/// The struct that stores the context for the maths parser. -/// This is currently just limited to supplying `a` and `b` until we add better node graph support and UI for variadic inputs. -struct MathNodeContext { - a: f64, - b: f64, -} - -impl ValueProvider for MathNodeContext { - fn get_value(&self, name: &str) -> Option { - if name.eq_ignore_ascii_case("a") { - Some(Value::from_f64(self.a)) - } else if name.eq_ignore_ascii_case("b") { - Some(Value::from_f64(self.b)) - } else { - None - } - } -} - -/// Calculates a mathematical expression with input values "A" and "B" -#[node_macro::node(category("Math: Arithmetic"), properties("math_properties"))] -fn math( - _: impl Ctx, - /// The value of "A" when calculating the expression - #[implementations(f64, f32)] - operand_a: U, - /// A math expression that may incorporate "A" and/or "B", such as "sqrt(A + B) - B^2" - #[default(A + B)] - expression: String, - /// The value of "B" when calculating the expression - #[implementations(f64, f32)] - #[default(1.)] - operand_b: U, -) -> U { - let (node, _unit) = match ast::Node::try_parse_from_str(&expression) { - Ok(expr) => expr, - Err(e) => { - warn!("Invalid expression: `{expression}`\n{e:?}"); - return U::from(0.).unwrap(); - } - }; - let context = EvalContext::new( - MathNodeContext { - a: operand_a.to_f64().unwrap(), - b: operand_b.to_f64().unwrap(), - }, - NothingMap, - ); - - let value = match node.eval(&context) { - Ok(value) => value, - Err(e) => { - warn!("Expression evaluation error: {e:?}"); - return U::from(0.).unwrap(); - } - }; - - let Value::Number(num) = value; - match num { - Number::Real(val) => U::from(val).unwrap(), - Number::Complex(c) => U::from(c.re).unwrap(), - } -} - -/// The addition operation (+) calculates the sum of two numbers. -#[node_macro::node(category("Math: Arithmetic"))] -fn add, T>( - _: impl Ctx, - #[implementations(f64, &f64, f64, &f64, f32, &f32, f32, &f32, u32, &u32, u32, &u32, DVec2, f64, DVec2)] augend: U, - #[implementations(f64, f64, &f64, &f64, f32, f32, &f32, &f32, u32, u32, &u32, &u32, DVec2, DVec2, f64)] addend: T, -) -> >::Output { - augend + addend -} - -/// The subtraction operation (-) calculates the difference between two numbers. -#[node_macro::node(category("Math: Arithmetic"))] -fn subtract, T>( - _: impl Ctx, - #[implementations(f64, &f64, f64, &f64, f32, &f32, f32, &f32, u32, &u32, u32, &u32, DVec2, f64, DVec2)] minuend: U, - #[implementations(f64, f64, &f64, &f64, f32, f32, &f32, &f32, u32, u32, &u32, &u32, DVec2, DVec2, f64)] subtrahend: T, -) -> >::Output { - minuend - subtrahend -} - -/// The multiplication operation (×) calculates the product of two numbers. -#[node_macro::node(category("Math: Arithmetic"))] -fn multiply, T>( - _: impl Ctx, - #[implementations(f64, &f64, f64, &f64, f32, &f32, f32, &f32, u32, &u32, u32, &u32, DVec2, f64, DVec2)] multiplier: U, - #[default(1.)] - #[implementations(f64, f64, &f64, &f64, f32, f32, &f32, &f32, u32, u32, &u32, &u32, DVec2, DVec2, f64)] - multiplicand: T, -) -> >::Output { - multiplier * multiplicand -} - -/// The division operation (÷) calculates the quotient of two numbers. -/// -/// Produces 0 if the denominator is 0. -#[node_macro::node(category("Math: Arithmetic"))] -fn divide + Default + PartialEq, T: Default + PartialEq>( - _: impl Ctx, - #[implementations(f64, f64, f32, f32, u32, u32, DVec2, DVec2, f64)] numerator: U, - #[default(1.)] - #[implementations(f64, f64, f32, f32, u32, u32, DVec2, f64, DVec2)] - denominator: T, -) -> >::Output -where - >::Output: Default, -{ - if denominator == T::default() { - return >::Output::default(); - } - numerator / denominator -} - -/// The modulo operation (%) calculates the remainder from the division of two numbers. The sign of the result shares the sign of the numerator unless "Always Positive" is enabled. -#[node_macro::node(category("Math: Arithmetic"))] -fn modulo>>, T: Copy>( - _: impl Ctx, - #[implementations(f64, &f64, f64, &f64, f32, &f32, f32, &f32, u32, &u32, u32, &u32, DVec2, DVec2, f64)] numerator: U, - #[default(2.)] - #[implementations(f64, f64, &f64, &f64, f32, f32, &f32, &f32, u32, u32, &u32, &u32, DVec2, f64, DVec2)] - modulus: T, - always_positive: bool, -) -> >::Output { - if always_positive { (numerator % modulus + modulus) % modulus } else { numerator % modulus } -} - -/// The exponent operation (^) calculates the result of raising a number to a power. -#[node_macro::node(category("Math: Arithmetic"))] -fn exponent, T>( - _: impl Ctx, - #[implementations(f64, &f64, f64, &f64, f32, &f32, f32, &f32, u32, &u32, u32, &u32)] base: U, - #[default(2.)] - #[implementations(f64, f64, &f64, &f64, f32, f32, &f32, &f32, u32, u32, &u32, &u32)] - power: T, -) -> >::Output { - base.pow(power) -} - -/// The square root operation (√) calculates the nth root of a number, equivalent to raising the number to the power of 1/n. -#[node_macro::node(category("Math: Arithmetic"))] -fn root( - _: impl Ctx, - #[default(2.)] - #[implementations(f64, f32)] - radicand: U, - #[default(2.)] - #[implementations(f64, f32)] - degree: U, -) -> U { - if degree == U::from(2.).unwrap() { - radicand.sqrt() - } else if degree == U::from(3.).unwrap() { - radicand.cbrt() - } else { - radicand.powf(U::from(1.).unwrap() / degree) - } -} - -/// The logarithmic function (log) calculates the logarithm of a number with a specified base. If the natural logarithm function (ln) is desired, set the base to "e". -#[node_macro::node(category("Math: Arithmetic"))] -fn logarithm( - _: impl Ctx, - #[implementations(f64, f32)] value: U, - #[default(2.)] - #[implementations(f64, f32)] - base: U, -) -> U { - if base == U::from(2.).unwrap() { - value.log2() - } else if base == U::from(10.).unwrap() { - value.log10() - } else if base - U::from(std::f64::consts::E).unwrap() < U::epsilon() * U::from(1e6).unwrap() { - value.ln() - } else { - value.log(base) - } -} - -/// The sine trigonometric function (sin) calculates the ratio of the angle's opposite side length to its hypotenuse length. -#[node_macro::node(category("Math: Trig"))] -fn sine(_: impl Ctx, #[implementations(f64, f32)] theta: U, radians: bool) -> U { - if radians { theta.sin() } else { theta.to_radians().sin() } -} - -/// The cosine trigonometric function (cos) calculates the ratio of the angle's adjacent side length to its hypotenuse length. -#[node_macro::node(category("Math: Trig"))] -fn cosine(_: impl Ctx, #[implementations(f64, f32)] theta: U, radians: bool) -> U { - if radians { theta.cos() } else { theta.to_radians().cos() } -} - -/// The tangent trigonometric function (tan) calculates the ratio of the angle's opposite side length to its adjacent side length. -#[node_macro::node(category("Math: Trig"))] -fn tangent(_: impl Ctx, #[implementations(f64, f32)] theta: U, radians: bool) -> U { - if radians { theta.tan() } else { theta.to_radians().tan() } -} - -/// The inverse sine trigonometric function (asin) calculates the angle whose sine is the specified value. -#[node_macro::node(category("Math: Trig"))] -fn sine_inverse(_: impl Ctx, #[implementations(f64, f32)] value: U, radians: bool) -> U { - if radians { value.asin() } else { value.asin().to_degrees() } -} - -/// The inverse cosine trigonometric function (acos) calculates the angle whose cosine is the specified value. -#[node_macro::node(category("Math: Trig"))] -fn cosine_inverse(_: impl Ctx, #[implementations(f64, f32)] value: U, radians: bool) -> U { - if radians { value.acos() } else { value.acos().to_degrees() } -} - -/// The inverse tangent trigonometric function (atan or atan2, depending on input type) calculates: -/// atan: the angle whose tangent is the specified scalar number. -/// atan2: the angle of a ray from the origin to the specified coordinate. -#[node_macro::node(category("Math: Trig"))] -fn tangent_inverse(_: impl Ctx, #[implementations(f64, f32, DVec2)] value: U, radians: bool) -> U::Output { - value.atan(radians) -} - -pub trait TangentInverse { - type Output: num_traits::float::Float; - fn atan(self, radians: bool) -> Self::Output; -} -impl TangentInverse for f32 { - type Output = f32; - fn atan(self, radians: bool) -> Self::Output { - if radians { self.atan() } else { self.atan().to_degrees() } - } -} -impl TangentInverse for f64 { - type Output = f64; - fn atan(self, radians: bool) -> Self::Output { - if radians { self.atan() } else { self.atan().to_degrees() } - } -} -impl TangentInverse for DVec2 { - type Output = f64; - fn atan(self, radians: bool) -> Self::Output { - if radians { self.y.atan2(self.x) } else { self.y.atan2(self.x).to_degrees() } - } -} - -/// The random function (rand) converts a seed into a random number within the specified range, inclusive of the minimum and exclusive of the maximum. The minimum and maximum values are automatically swapped if they are reversed. -#[node_macro::node(category("Math: Numeric"))] -fn random( - _: impl Ctx, - _primary: (), - seed: u64, - #[implementations(f64, f32)] - #[default(0.)] - min: U, - #[implementations(f64, f32)] - #[default(1.)] - max: U, -) -> f64 { - let mut rng = rand::rngs::StdRng::seed_from_u64(seed); - let result = rng.random::(); - let (min, max) = if min < max { (min, max) } else { (max, min) }; - let (min, max) = (min.to_f64().unwrap(), max.to_f64().unwrap()); - result * (max - min) + min -} - -/// Convert a number to an integer of the type u32, which may be the required type for certain node inputs. This will be removed in the future when automatic type conversion is implemented. -#[node_macro::node(name("To u32"), category("Math: Numeric"))] -fn to_u32(_: impl Ctx, #[implementations(f64, f32)] value: U) -> u32 { - let value = U::clamp(value, U::from(0.).unwrap(), U::from(u32::MAX as f64).unwrap()); - value.to_u32().unwrap() -} - -/// Convert a number to an integer of the type u64, which may be the required type for certain node inputs. This will be removed in the future when automatic type conversion is implemented. -#[node_macro::node(name("To u64"), category("Math: Numeric"))] -fn to_u64(_: impl Ctx, #[implementations(f64, f32)] value: U) -> u64 { - let value = U::clamp(value, U::from(0.).unwrap(), U::from(u64::MAX as f64).unwrap()); - value.to_u64().unwrap() -} - -/// Convert an integer to a decimal number of the type f64, which may be the required type for certain node inputs. This will be removed in the future when automatic type conversion is implemented. -#[node_macro::node(name("To f64"), category("Math: Numeric"))] -fn to_f64(_: impl Ctx, #[implementations(u32, u64)] value: U) -> f64 { - value.to_f64().unwrap() -} - -/// The rounding function (round) maps an input value to its nearest whole number. Halfway values are rounded away from zero. -#[node_macro::node(category("Math: Numeric"))] -fn round(_: impl Ctx, #[implementations(f64, f32)] value: U) -> U { - value.round() -} - -/// The floor function (floor) reduces an input value to its nearest larger whole number, unless the input number is already whole. -#[node_macro::node(category("Math: Numeric"))] -fn floor(_: impl Ctx, #[implementations(f64, f32)] value: U) -> U { - value.floor() -} - -/// The ceiling function (ceil) increases an input value to its nearest smaller whole number, unless the input number is already whole. -#[node_macro::node(category("Math: Numeric"))] -fn ceiling(_: impl Ctx, #[implementations(f64, f32)] value: U) -> U { - value.ceil() -} - -/// The absolute value function (abs) removes the negative sign from an input value, if present. -#[node_macro::node(category("Math: Numeric"))] -fn absolute_value(_: impl Ctx, #[implementations(f64, f32)] value: U) -> U { - value.abs() -} - -/// The minimum function (min) picks the smaller of two numbers. -#[node_macro::node(category("Math: Numeric"))] -fn min(_: impl Ctx, #[implementations(f64, &f64, f32, &f32, u32, &u32, &str)] value: T, #[implementations(f64, &f64, f32, &f32, u32, &u32, &str)] other_value: T) -> T { - if value < other_value { value } else { other_value } -} - -/// The maximum function (max) picks the larger of two numbers. -#[node_macro::node(category("Math: Numeric"))] -fn max(_: impl Ctx, #[implementations(f64, &f64, f32, &f32, u32, &u32, &str)] value: T, #[implementations(f64, &f64, f32, &f32, u32, &u32, &str)] other_value: T) -> T { - if value > other_value { value } else { other_value } -} - -/// The clamp function (clamp) restricts a number to a specified range between a minimum and maximum value. The minimum and maximum values are automatically swapped if they are reversed. -#[node_macro::node(category("Math: Numeric"))] -fn clamp( - _: impl Ctx, - #[implementations(f64, &f64, f32, &f32, u32, &u32, &str)] value: T, - #[implementations(f64, &f64, f32, &f32, u32, &u32, &str)] min: T, - #[implementations(f64, &f64, f32, &f32, u32, &u32, &str)] max: T, -) -> T { - let (min, max) = if min < max { (min, max) } else { (max, min) }; - if value < min { - min - } else if value > max { - max - } else { - value - } -} - -/// The equality operation (==) compares two values and returns true if they are equal, or false if they are not. -#[node_macro::node(category("Math: Logic"))] -fn equals, T>( - _: impl Ctx, - #[implementations(f64, &f64, f32, &f32, u32, &u32, DVec2, &DVec2, &str)] value: T, - #[implementations(f64, &f64, f32, &f32, u32, &u32, DVec2, &DVec2, &str)] other_value: U, -) -> bool { - other_value == value -} - -/// The inequality operation (!=) compares two values and returns true if they are not equal, or false if they are. -#[node_macro::node(category("Math: Logic"))] -fn not_equals, T>( - _: impl Ctx, - #[implementations(f64, &f64, f32, &f32, u32, &u32, DVec2, &DVec2, &str)] value: T, - #[implementations(f64, &f64, f32, &f32, u32, &u32, DVec2, &DVec2, &str)] other_value: U, -) -> bool { - other_value != value -} - -/// The less-than operation (<) compares two values and returns true if the first value is less than the second, or false if it is not. -/// If enabled with "Or Equal", the less-than-or-equal operation (<=) will be used instead. -#[node_macro::node(category("Math: Logic"))] -fn less_than>( - _: impl Ctx, - #[implementations(f64, &f64, f32, &f32, u32, &u32)] value: T, - #[implementations(f64, &f64, f32, &f32, u32, &u32)] other_value: T, - or_equal: bool, -) -> bool { - if or_equal { value <= other_value } else { value < other_value } -} - -/// The greater-than operation (>) compares two values and returns true if the first value is greater than the second, or false if it is not. -/// If enabled with "Or Equal", the greater-than-or-equal operation (>=) will be used instead. -#[node_macro::node(category("Math: Logic"))] -fn greater_than>( - _: impl Ctx, - #[implementations(f64, &f64, f32, &f32, u32, &u32)] value: T, - #[implementations(f64, &f64, f32, &f32, u32, &u32)] other_value: T, - or_equal: bool, -) -> bool { - if or_equal { value >= other_value } else { value > other_value } -} - -/// The logical or operation (||) returns true if either of the two inputs are true, or false if both are false. -#[node_macro::node(category("Math: Logic"))] -fn logical_or(_: impl Ctx, value: bool, other_value: bool) -> bool { - value || other_value -} - -/// The logical and operation (&&) returns true if both of the two inputs are true, or false if any are false. -#[node_macro::node(category("Math: Logic"))] -fn logical_and(_: impl Ctx, value: bool, other_value: bool) -> bool { - value && other_value -} - -/// The logical not operation (!) reverses true and false value of the input. -#[node_macro::node(category("Math: Logic"))] -fn logical_not(_: impl Ctx, input: bool) -> bool { - !input -} - -/// Constructs a bool value which may be set to true or false. -#[node_macro::node(category("Value"))] -fn bool_value(_: impl Ctx, _primary: (), #[name("Bool")] bool_value: bool) -> bool { - bool_value -} - -/// Constructs a number value which may be set to any real number. -#[node_macro::node(category("Value"))] -fn number_value(_: impl Ctx, _primary: (), number: f64) -> f64 { - number -} - -/// Constructs a number value which may be set to any value from 0% to 100% by dragging the slider. -#[node_macro::node(category("Value"))] -fn percentage_value(_: impl Ctx, _primary: (), percentage: Percentage) -> f64 { - percentage -} - -/// Constructs a two-dimensional vector value which may be set to any XY coordinate. -#[node_macro::node(category("Value"))] -fn coordinate_value(_: impl Ctx, _primary: (), x: f64, y: f64) -> DVec2 { - DVec2::new(x, y) -} - -/// Constructs a color value which may be set to any color, or no color. -#[node_macro::node(category("Value"))] -fn color_value(_: impl Ctx, _primary: (), #[default(Color::BLACK)] color: Option) -> Option { - color -} - -/// Gets the color at the specified position along the gradient, given a position from 0 (left) to 1 (right). -#[node_macro::node(category("Color"))] -fn sample_gradient(_: impl Ctx, _primary: (), gradient: GradientStops, position: Fraction) -> Color { - let position = position.clamp(0., 1.); - gradient.evaluate(position) -} - -/// Constructs a gradient value which may be set to any sequence of color stops to represent the transition between colors. -#[node_macro::node(category("Value"))] -fn gradient_value(_: impl Ctx, _primary: (), gradient: GradientStops) -> GradientStops { - gradient -} - -/// Constructs a string value which may be set to any plain text. -#[node_macro::node(category("Value"))] -fn string_value(_: impl Ctx, _primary: (), string: String) -> String { - string -} - -/// Meant for debugging purposes, not general use. Returns the size of the input type in bytes. -#[node_macro::node(category("Debug"))] -fn size_of(_: impl Ctx, ty: crate::Type) -> Option { - ty.size() -} - -/// Meant for debugging purposes, not general use. Wraps the input value in the Some variant of an Option. -#[node_macro::node(category("Debug"))] -fn some(_: impl Ctx, #[implementations(f64, f32, u32, u64, String, Color)] input: T) -> Option { - Some(input) -} - -/// Meant for debugging purposes, not general use. Unwraps the input value from an Option, returning the default value if the input is None. -#[node_macro::node(category("Debug"))] -fn unwrap(_: impl Ctx, #[implementations(Option, Option, Option, Option, Option, Option)] input: Option) -> T { - input.unwrap_or_default() -} - -/// Meant for debugging purposes, not general use. Clones the input value. -#[node_macro::node(category("Debug"))] -fn clone<'i, T: Clone + 'i>(_: impl Ctx, #[implementations(&RasterDataTable)] value: &'i T) -> T { - value.clone() -} - -#[node_macro::node(category("Math: Vector"))] -fn dot_product(_: impl Ctx, vector_a: DVec2, vector_b: DVec2) -> f64 { - vector_a.dot(vector_b) -} - -/// Obtain the X or Y component of a coordinate. -#[node_macro::node(name("Extract XY"), category("Math: Vector"))] -fn extract_xy>(_: impl Ctx, #[implementations(DVec2, IVec2, UVec2)] vector: T, axis: XY) -> f64 { - match axis { - XY::X => vector.into().x, - XY::Y => vector.into().y, - } -} - -/// The X or Y component of a coordinate. -#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, DynAny, node_macro::ChoiceType, specta::Type, serde::Serialize, serde::Deserialize)] -#[widget(Dropdown)] -pub enum XY { - #[default] - X, - Y, -} // TODO: Rename to "Passthrough" /// Passes-through the input value without changing it. This is useful for rerouting wires for organization purposes. @@ -644,72 +138,9 @@ impl<'input, I: 'input + Convert<_O> + Sync + Send, _O: 'input> Node<'input, I> #[cfg(test)] mod test { use super::*; - use crate::generic::*; - - #[test] - pub fn dot_product_function() { - let vector_a = DVec2::new(1., 2.); - let vector_b = DVec2::new(3., 4.); - assert_eq!(dot_product((), vector_a, vector_b), 11.); - } - - #[test] - fn test_basic_expression() { - let result = math((), 0., "2 + 2".to_string(), 0.); - assert_eq!(result, 4.); - } - - #[test] - fn test_complex_expression() { - let result = math((), 0., "(5 * 3) + (10 / 2)".to_string(), 0.); - assert_eq!(result, 20.); - } - - #[test] - fn test_default_expression() { - let result = math((), 0., "0".to_string(), 0.); - assert_eq!(result, 0.); - } - - #[test] - fn test_invalid_expression() { - let result = math((), 0., "invalid".to_string(), 0.); - assert_eq!(result, 0.); - } #[test] pub fn identity_node() { assert_eq!(identity(&4), &4); } - - #[test] - pub fn foo() { - let fnn = FnNode::new(|(a, b)| (b, a)); - assert_eq!(fnn.eval((1u32, 2u32)), (2, 1)); - } - - #[test] - pub fn add_vectors() { - assert_eq!(super::add((), DVec2::ONE, DVec2::ONE), DVec2::ONE * 2.); - } - - #[test] - pub fn subtract_f64() { - assert_eq!(super::subtract((), 5_f64, 3_f64), 2.); - } - - #[test] - pub fn divide_vectors() { - assert_eq!(super::divide((), DVec2::ONE, 2_f64), DVec2::ONE / 2.); - } - - #[test] - pub fn modulo_positive() { - assert_eq!(super::modulo((), -5_f64, 2_f64, true), 1_f64); - } - - #[test] - pub fn modulo_negative() { - assert_eq!(super::modulo((), -5_f64, 2_f64, false), -1_f64); - } } diff --git a/node-graph/gcore/src/vector/algorithms/instance.rs b/node-graph/gcore/src/vector/algorithms/instance.rs index dde9a9f422..5b94903702 100644 --- a/node-graph/gcore/src/vector/algorithms/instance.rs +++ b/node-graph/gcore/src/vector/algorithms/instance.rs @@ -99,7 +99,7 @@ async fn instance_index(ctx: impl Ctx + ExtractIndex) -> f64 { mod test { use super::*; use crate::Node; - use crate::ops::ExtractXyNode; + use crate::extract_xy::{ExtractXyNode, XY}; use crate::vector::VectorData; use bezier_rs::Subpath; use glam::DVec2; @@ -121,7 +121,7 @@ mod test { let owned = OwnedContextImpl::default().into_context(); let rect = crate::vector::generator_nodes::RectangleNode::new( FutureWrapperNode(()), - ExtractXyNode::new(InstancePositionNode {}, FutureWrapperNode(crate::ops::XY::Y)), + ExtractXyNode::new(InstancePositionNode {}, FutureWrapperNode(XY::Y)), FutureWrapperNode(2_f64), FutureWrapperNode(false), FutureWrapperNode(0_f64), diff --git a/node-graph/gmath-nodes/Cargo.toml b/node-graph/gmath-nodes/Cargo.toml new file mode 100644 index 0000000000..f7ab5c30ba --- /dev/null +++ b/node-graph/gmath-nodes/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "graphene-math-nodes" +version = "0.1.0" +edition = "2024" +description = "graphene math nodes" +authors = ["Graphite Authors "] +license = "MIT OR Apache-2.0" + +[dependencies] +graphene-core = { workspace = true } +node-macro = { workspace = true } + +# Workspace dependencies +glam = { workspace = true } +rand = { workspace = true } +math-parser = { workspace = true } +log = { workspace = true } diff --git a/node-graph/gmath-nodes/src/lib.rs b/node-graph/gmath-nodes/src/lib.rs new file mode 100644 index 0000000000..37a7ed3644 --- /dev/null +++ b/node-graph/gmath-nodes/src/lib.rs @@ -0,0 +1,532 @@ +use glam::DVec2; +use graphene_core::gradient::GradientStops; +use graphene_core::registry::types::{Fraction, Percentage}; +use graphene_core::{Color, Ctx, num_traits}; +use log::warn; +use math_parser::ast; +use math_parser::context::{EvalContext, NothingMap, ValueProvider}; +use math_parser::value::{Number, Value}; +use num_traits::Pow; +use rand::{Rng, SeedableRng}; +use std::ops::{Add, Div, Mul, Rem, Sub}; + +/// The struct that stores the context for the maths parser. +/// This is currently just limited to supplying `a` and `b` until we add better node graph support and UI for variadic inputs. +struct MathNodeContext { + a: f64, + b: f64, +} + +impl ValueProvider for MathNodeContext { + fn get_value(&self, name: &str) -> Option { + if name.eq_ignore_ascii_case("a") { + Some(Value::from_f64(self.a)) + } else if name.eq_ignore_ascii_case("b") { + Some(Value::from_f64(self.b)) + } else { + None + } + } +} + +/// Calculates a mathematical expression with input values "A" and "B" +#[node_macro::node(category("Math: Arithmetic"), properties("math_properties"))] +fn math( + _: impl Ctx, + /// The value of "A" when calculating the expression + #[implementations(f64, f32)] + operand_a: U, + /// A math expression that may incorporate "A" and/or "B", such as "sqrt(A + B) - B^2" + #[default(A + B)] + expression: String, + /// The value of "B" when calculating the expression + #[implementations(f64, f32)] + #[default(1.)] + operand_b: U, +) -> U { + let (node, _unit) = match ast::Node::try_parse_from_str(&expression) { + Ok(expr) => expr, + Err(e) => { + warn!("Invalid expression: `{expression}`\n{e:?}"); + return U::from(0.).unwrap(); + } + }; + let context = EvalContext::new( + MathNodeContext { + a: operand_a.to_f64().unwrap(), + b: operand_b.to_f64().unwrap(), + }, + NothingMap, + ); + + let value = match node.eval(&context) { + Ok(value) => value, + Err(e) => { + warn!("Expression evaluation error: {e:?}"); + return U::from(0.).unwrap(); + } + }; + + let Value::Number(num) = value; + match num { + Number::Real(val) => U::from(val).unwrap(), + Number::Complex(c) => U::from(c.re).unwrap(), + } +} + +/// The addition operation (+) calculates the sum of two numbers. +#[node_macro::node(category("Math: Arithmetic"))] +fn add, T>( + _: impl Ctx, + #[implementations(f64, &f64, f64, &f64, f32, &f32, f32, &f32, u32, &u32, u32, &u32, DVec2, f64, DVec2)] augend: U, + #[implementations(f64, f64, &f64, &f64, f32, f32, &f32, &f32, u32, u32, &u32, &u32, DVec2, DVec2, f64)] addend: T, +) -> >::Output { + augend + addend +} + +/// The subtraction operation (-) calculates the difference between two numbers. +#[node_macro::node(category("Math: Arithmetic"))] +fn subtract, T>( + _: impl Ctx, + #[implementations(f64, &f64, f64, &f64, f32, &f32, f32, &f32, u32, &u32, u32, &u32, DVec2, f64, DVec2)] minuend: U, + #[implementations(f64, f64, &f64, &f64, f32, f32, &f32, &f32, u32, u32, &u32, &u32, DVec2, DVec2, f64)] subtrahend: T, +) -> >::Output { + minuend - subtrahend +} + +/// The multiplication operation (×) calculates the product of two numbers. +#[node_macro::node(category("Math: Arithmetic"))] +fn multiply, T>( + _: impl Ctx, + #[implementations(f64, &f64, f64, &f64, f32, &f32, f32, &f32, u32, &u32, u32, &u32, DVec2, f64, DVec2)] multiplier: U, + #[default(1.)] + #[implementations(f64, f64, &f64, &f64, f32, f32, &f32, &f32, u32, u32, &u32, &u32, DVec2, DVec2, f64)] + multiplicand: T, +) -> >::Output { + multiplier * multiplicand +} + +/// The division operation (÷) calculates the quotient of two numbers. +/// +/// Produces 0 if the denominator is 0. +#[node_macro::node(category("Math: Arithmetic"))] +fn divide + Default + PartialEq, T: Default + PartialEq>( + _: impl Ctx, + #[implementations(f64, f64, f32, f32, u32, u32, DVec2, DVec2, f64)] numerator: U, + #[default(1.)] + #[implementations(f64, f64, f32, f32, u32, u32, DVec2, f64, DVec2)] + denominator: T, +) -> >::Output +where + >::Output: Default, +{ + if denominator == T::default() { + return >::Output::default(); + } + numerator / denominator +} + +/// The modulo operation (%) calculates the remainder from the division of two numbers. The sign of the result shares the sign of the numerator unless "Always Positive" is enabled. +#[node_macro::node(category("Math: Arithmetic"))] +fn modulo>>, T: Copy>( + _: impl Ctx, + #[implementations(f64, &f64, f64, &f64, f32, &f32, f32, &f32, u32, &u32, u32, &u32, DVec2, DVec2, f64)] numerator: U, + #[default(2.)] + #[implementations(f64, f64, &f64, &f64, f32, f32, &f32, &f32, u32, u32, &u32, &u32, DVec2, f64, DVec2)] + modulus: T, + always_positive: bool, +) -> >::Output { + if always_positive { (numerator % modulus + modulus) % modulus } else { numerator % modulus } +} + +/// The exponent operation (^) calculates the result of raising a number to a power. +#[node_macro::node(category("Math: Arithmetic"))] +fn exponent, T>( + _: impl Ctx, + #[implementations(f64, &f64, f64, &f64, f32, &f32, f32, &f32, u32, &u32, u32, &u32)] base: U, + #[default(2.)] + #[implementations(f64, f64, &f64, &f64, f32, f32, &f32, &f32, u32, u32, &u32, &u32)] + power: T, +) -> >::Output { + base.pow(power) +} + +/// The square root operation (√) calculates the nth root of a number, equivalent to raising the number to the power of 1/n. +#[node_macro::node(category("Math: Arithmetic"))] +fn root( + _: impl Ctx, + #[default(2.)] + #[implementations(f64, f32)] + radicand: U, + #[default(2.)] + #[implementations(f64, f32)] + degree: U, +) -> U { + if degree == U::from(2.).unwrap() { + radicand.sqrt() + } else if degree == U::from(3.).unwrap() { + radicand.cbrt() + } else { + radicand.powf(U::from(1.).unwrap() / degree) + } +} + +/// The logarithmic function (log) calculates the logarithm of a number with a specified base. If the natural logarithm function (ln) is desired, set the base to "e". +#[node_macro::node(category("Math: Arithmetic"))] +fn logarithm( + _: impl Ctx, + #[implementations(f64, f32)] value: U, + #[default(2.)] + #[implementations(f64, f32)] + base: U, +) -> U { + if base == U::from(2.).unwrap() { + value.log2() + } else if base == U::from(10.).unwrap() { + value.log10() + } else if base - U::from(std::f64::consts::E).unwrap() < U::epsilon() * U::from(1e6).unwrap() { + value.ln() + } else { + value.log(base) + } +} + +/// The sine trigonometric function (sin) calculates the ratio of the angle's opposite side length to its hypotenuse length. +#[node_macro::node(category("Math: Trig"))] +fn sine(_: impl Ctx, #[implementations(f64, f32)] theta: U, radians: bool) -> U { + if radians { theta.sin() } else { theta.to_radians().sin() } +} + +/// The cosine trigonometric function (cos) calculates the ratio of the angle's adjacent side length to its hypotenuse length. +#[node_macro::node(category("Math: Trig"))] +fn cosine(_: impl Ctx, #[implementations(f64, f32)] theta: U, radians: bool) -> U { + if radians { theta.cos() } else { theta.to_radians().cos() } +} + +/// The tangent trigonometric function (tan) calculates the ratio of the angle's opposite side length to its adjacent side length. +#[node_macro::node(category("Math: Trig"))] +fn tangent(_: impl Ctx, #[implementations(f64, f32)] theta: U, radians: bool) -> U { + if radians { theta.tan() } else { theta.to_radians().tan() } +} + +/// The inverse sine trigonometric function (asin) calculates the angle whose sine is the specified value. +#[node_macro::node(category("Math: Trig"))] +fn sine_inverse(_: impl Ctx, #[implementations(f64, f32)] value: U, radians: bool) -> U { + if radians { value.asin() } else { value.asin().to_degrees() } +} + +/// The inverse cosine trigonometric function (acos) calculates the angle whose cosine is the specified value. +#[node_macro::node(category("Math: Trig"))] +fn cosine_inverse(_: impl Ctx, #[implementations(f64, f32)] value: U, radians: bool) -> U { + if radians { value.acos() } else { value.acos().to_degrees() } +} + +/// The inverse tangent trigonometric function (atan or atan2, depending on input type) calculates: +/// atan: the angle whose tangent is the specified scalar number. +/// atan2: the angle of a ray from the origin to the specified coordinate. +#[node_macro::node(category("Math: Trig"))] +fn tangent_inverse(_: impl Ctx, #[implementations(f64, f32, DVec2)] value: U, radians: bool) -> U::Output { + value.atan(radians) +} + +pub trait TangentInverse { + type Output: num_traits::float::Float; + fn atan(self, radians: bool) -> Self::Output; +} +impl TangentInverse for f32 { + type Output = f32; + fn atan(self, radians: bool) -> Self::Output { + if radians { self.atan() } else { self.atan().to_degrees() } + } +} +impl TangentInverse for f64 { + type Output = f64; + fn atan(self, radians: bool) -> Self::Output { + if radians { self.atan() } else { self.atan().to_degrees() } + } +} +impl TangentInverse for DVec2 { + type Output = f64; + fn atan(self, radians: bool) -> Self::Output { + if radians { self.y.atan2(self.x) } else { self.y.atan2(self.x).to_degrees() } + } +} + +/// The random function (rand) converts a seed into a random number within the specified range, inclusive of the minimum and exclusive of the maximum. The minimum and maximum values are automatically swapped if they are reversed. +#[node_macro::node(category("Math: Numeric"))] +fn random( + _: impl Ctx, + _primary: (), + seed: u64, + #[implementations(f64, f32)] + #[default(0.)] + min: U, + #[implementations(f64, f32)] + #[default(1.)] + max: U, +) -> f64 { + let mut rng = rand::rngs::StdRng::seed_from_u64(seed); + let result = rng.random::(); + let (min, max) = if min < max { (min, max) } else { (max, min) }; + let (min, max) = (min.to_f64().unwrap(), max.to_f64().unwrap()); + result * (max - min) + min +} + +/// Convert a number to an integer of the type u32, which may be the required type for certain node inputs. This will be removed in the future when automatic type conversion is implemented. +#[node_macro::node(name("To u32"), category("Math: Numeric"))] +fn to_u32(_: impl Ctx, #[implementations(f64, f32)] value: U) -> u32 { + let value = U::clamp(value, U::from(0.).unwrap(), U::from(u32::MAX as f64).unwrap()); + value.to_u32().unwrap() +} + +/// Convert a number to an integer of the type u64, which may be the required type for certain node inputs. This will be removed in the future when automatic type conversion is implemented. +#[node_macro::node(name("To u64"), category("Math: Numeric"))] +fn to_u64(_: impl Ctx, #[implementations(f64, f32)] value: U) -> u64 { + let value = U::clamp(value, U::from(0.).unwrap(), U::from(u64::MAX as f64).unwrap()); + value.to_u64().unwrap() +} + +/// Convert an integer to a decimal number of the type f64, which may be the required type for certain node inputs. This will be removed in the future when automatic type conversion is implemented. +#[node_macro::node(name("To f64"), category("Math: Numeric"))] +fn to_f64(_: impl Ctx, #[implementations(u32, u64)] value: U) -> f64 { + value.to_f64().unwrap() +} + +/// The rounding function (round) maps an input value to its nearest whole number. Halfway values are rounded away from zero. +#[node_macro::node(category("Math: Numeric"))] +fn round(_: impl Ctx, #[implementations(f64, f32)] value: U) -> U { + value.round() +} + +/// The floor function (floor) reduces an input value to its nearest larger whole number, unless the input number is already whole. +#[node_macro::node(category("Math: Numeric"))] +fn floor(_: impl Ctx, #[implementations(f64, f32)] value: U) -> U { + value.floor() +} + +/// The ceiling function (ceil) increases an input value to its nearest smaller whole number, unless the input number is already whole. +#[node_macro::node(category("Math: Numeric"))] +fn ceiling(_: impl Ctx, #[implementations(f64, f32)] value: U) -> U { + value.ceil() +} + +/// The absolute value function (abs) removes the negative sign from an input value, if present. +#[node_macro::node(category("Math: Numeric"))] +fn absolute_value(_: impl Ctx, #[implementations(f64, f32)] value: U) -> U { + value.abs() +} + +/// The minimum function (min) picks the smaller of two numbers. +#[node_macro::node(category("Math: Numeric"))] +fn min(_: impl Ctx, #[implementations(f64, &f64, f32, &f32, u32, &u32, &str)] value: T, #[implementations(f64, &f64, f32, &f32, u32, &u32, &str)] other_value: T) -> T { + if value < other_value { value } else { other_value } +} + +/// The maximum function (max) picks the larger of two numbers. +#[node_macro::node(category("Math: Numeric"))] +fn max(_: impl Ctx, #[implementations(f64, &f64, f32, &f32, u32, &u32, &str)] value: T, #[implementations(f64, &f64, f32, &f32, u32, &u32, &str)] other_value: T) -> T { + if value > other_value { value } else { other_value } +} + +/// The clamp function (clamp) restricts a number to a specified range between a minimum and maximum value. The minimum and maximum values are automatically swapped if they are reversed. +#[node_macro::node(category("Math: Numeric"))] +fn clamp( + _: impl Ctx, + #[implementations(f64, &f64, f32, &f32, u32, &u32, &str)] value: T, + #[implementations(f64, &f64, f32, &f32, u32, &u32, &str)] min: T, + #[implementations(f64, &f64, f32, &f32, u32, &u32, &str)] max: T, +) -> T { + let (min, max) = if min < max { (min, max) } else { (max, min) }; + if value < min { + min + } else if value > max { + max + } else { + value + } +} + +/// The equality operation (==) compares two values and returns true if they are equal, or false if they are not. +#[node_macro::node(category("Math: Logic"))] +fn equals, T>( + _: impl Ctx, + #[implementations(f64, &f64, f32, &f32, u32, &u32, DVec2, &DVec2, &str)] value: T, + #[implementations(f64, &f64, f32, &f32, u32, &u32, DVec2, &DVec2, &str)] other_value: U, +) -> bool { + other_value == value +} + +/// The inequality operation (!=) compares two values and returns true if they are not equal, or false if they are. +#[node_macro::node(category("Math: Logic"))] +fn not_equals, T>( + _: impl Ctx, + #[implementations(f64, &f64, f32, &f32, u32, &u32, DVec2, &DVec2, &str)] value: T, + #[implementations(f64, &f64, f32, &f32, u32, &u32, DVec2, &DVec2, &str)] other_value: U, +) -> bool { + other_value != value +} + +/// The less-than operation (<) compares two values and returns true if the first value is less than the second, or false if it is not. +/// If enabled with "Or Equal", the less-than-or-equal operation (<=) will be used instead. +#[node_macro::node(category("Math: Logic"))] +fn less_than>( + _: impl Ctx, + #[implementations(f64, &f64, f32, &f32, u32, &u32)] value: T, + #[implementations(f64, &f64, f32, &f32, u32, &u32)] other_value: T, + or_equal: bool, +) -> bool { + if or_equal { value <= other_value } else { value < other_value } +} + +/// The greater-than operation (>) compares two values and returns true if the first value is greater than the second, or false if it is not. +/// If enabled with "Or Equal", the greater-than-or-equal operation (>=) will be used instead. +#[node_macro::node(category("Math: Logic"))] +fn greater_than>( + _: impl Ctx, + #[implementations(f64, &f64, f32, &f32, u32, &u32)] value: T, + #[implementations(f64, &f64, f32, &f32, u32, &u32)] other_value: T, + or_equal: bool, +) -> bool { + if or_equal { value >= other_value } else { value > other_value } +} + +/// The logical or operation (||) returns true if either of the two inputs are true, or false if both are false. +#[node_macro::node(category("Math: Logic"))] +fn logical_or(_: impl Ctx, value: bool, other_value: bool) -> bool { + value || other_value +} + +/// The logical and operation (&&) returns true if both of the two inputs are true, or false if any are false. +#[node_macro::node(category("Math: Logic"))] +fn logical_and(_: impl Ctx, value: bool, other_value: bool) -> bool { + value && other_value +} + +/// The logical not operation (!) reverses true and false value of the input. +#[node_macro::node(category("Math: Logic"))] +fn logical_not(_: impl Ctx, input: bool) -> bool { + !input +} + +/// Constructs a bool value which may be set to true or false. +#[node_macro::node(category("Value"))] +fn bool_value(_: impl Ctx, _primary: (), #[name("Bool")] bool_value: bool) -> bool { + bool_value +} + +/// Constructs a number value which may be set to any real number. +#[node_macro::node(category("Value"))] +fn number_value(_: impl Ctx, _primary: (), number: f64) -> f64 { + number +} + +/// Constructs a number value which may be set to any value from 0% to 100% by dragging the slider. +#[node_macro::node(category("Value"))] +fn percentage_value(_: impl Ctx, _primary: (), percentage: Percentage) -> f64 { + percentage +} + +/// Constructs a two-dimensional vector value which may be set to any XY coordinate. +#[node_macro::node(category("Value"))] +fn coordinate_value(_: impl Ctx, _primary: (), x: f64, y: f64) -> DVec2 { + DVec2::new(x, y) +} + +/// Constructs a color value which may be set to any color, or no color. +#[node_macro::node(category("Value"))] +fn color_value(_: impl Ctx, _primary: (), #[default(Color::BLACK)] color: Option) -> Option { + color +} + +/// Gets the color at the specified position along the gradient, given a position from 0 (left) to 1 (right). +#[node_macro::node(category("Color"))] +fn sample_gradient(_: impl Ctx, _primary: (), gradient: GradientStops, position: Fraction) -> Color { + let position = position.clamp(0., 1.); + gradient.evaluate(position) +} + +/// Constructs a gradient value which may be set to any sequence of color stops to represent the transition between colors. +#[node_macro::node(category("Value"))] +fn gradient_value(_: impl Ctx, _primary: (), gradient: GradientStops) -> GradientStops { + gradient +} + +/// Constructs a string value which may be set to any plain text. +#[node_macro::node(category("Value"))] +fn string_value(_: impl Ctx, _primary: (), string: String) -> String { + string +} + +#[node_macro::node(category("Math: Vector"))] +fn dot_product(_: impl Ctx, vector_a: DVec2, vector_b: DVec2) -> f64 { + vector_a.dot(vector_b) +} + +#[cfg(test)] +mod test { + use super::*; + use graphene_core::Node; + use graphene_core::generic::FnNode; + + #[test] + pub fn dot_product_function() { + let vector_a = DVec2::new(1., 2.); + let vector_b = DVec2::new(3., 4.); + assert_eq!(dot_product((), vector_a, vector_b), 11.); + } + + #[test] + fn test_basic_expression() { + let result = math((), 0., "2 + 2".to_string(), 0.); + assert_eq!(result, 4.); + } + + #[test] + fn test_complex_expression() { + let result = math((), 0., "(5 * 3) + (10 / 2)".to_string(), 0.); + assert_eq!(result, 20.); + } + + #[test] + fn test_default_expression() { + let result = math((), 0., "0".to_string(), 0.); + assert_eq!(result, 0.); + } + + #[test] + fn test_invalid_expression() { + let result = math((), 0., "invalid".to_string(), 0.); + assert_eq!(result, 0.); + } + + #[test] + pub fn foo() { + let fnn = FnNode::new(|(a, b)| (b, a)); + assert_eq!(fnn.eval((1u32, 2u32)), (2, 1)); + } + + #[test] + pub fn add_vectors() { + assert_eq!(super::add((), DVec2::ONE, DVec2::ONE), DVec2::ONE * 2.); + } + + #[test] + pub fn subtract_f64() { + assert_eq!(super::subtract((), 5_f64, 3_f64), 2.); + } + + #[test] + pub fn divide_vectors() { + assert_eq!(super::divide((), DVec2::ONE, 2_f64), DVec2::ONE / 2.); + } + + #[test] + pub fn modulo_positive() { + assert_eq!(super::modulo((), -5_f64, 2_f64, true), 1_f64); + } + + #[test] + pub fn modulo_negative() { + assert_eq!(super::modulo((), -5_f64, 2_f64, false), -1_f64); + } +} diff --git a/node-graph/graph-craft/src/document/value.rs b/node-graph/graph-craft/src/document/value.rs index 699b811dd4..742b155557 100644 --- a/node-graph/graph-craft/src/document/value.rs +++ b/node-graph/graph-craft/src/document/value.rs @@ -221,7 +221,7 @@ tagged_value! { // ========== BlendMode(BlendMode), LuminanceCalculation(LuminanceCalculation), - XY(graphene_core::ops::XY), + XY(graphene_core::extract_xy::XY), RedGreenBlue(graphene_core::raster::RedGreenBlue), RedGreenBlueAlpha(graphene_core::raster::RedGreenBlueAlpha), RealTimeMode(graphene_core::animation::RealTimeMode), diff --git a/node-graph/gstd/Cargo.toml b/node-graph/gstd/Cargo.toml index ec29d33b68..b8f4e01631 100644 --- a/node-graph/gstd/Cargo.toml +++ b/node-graph/gstd/Cargo.toml @@ -29,6 +29,7 @@ graph-craft = { workspace = true } wgpu-executor = { workspace = true } graphene-core = { workspace = true } graphene-path-bool = { workspace = true } +graphene-math-nodes = { workspace = true } graphene-svg-renderer = { workspace = true } graphene-application-io = { workspace = true } diff --git a/node-graph/gstd/src/lib.rs b/node-graph/gstd/src/lib.rs index 7fb750ff99..eeca277f67 100644 --- a/node-graph/gstd/src/lib.rs +++ b/node-graph/gstd/src/lib.rs @@ -12,6 +12,7 @@ pub mod wasm_application_io; pub use graphene_application_io as application_io; pub use graphene_core::vector; pub use graphene_core::*; +pub use graphene_math_nodes as math_nodes; pub use graphene_path_bool as path_bool; /// stop gap solution until all `Quad` and `Rect` paths have been replaced with their absolute ones From cf8496b5a00ef2c9bbe3a827e50641c5f1facf0b Mon Sep 17 00:00:00 2001 From: James Lindsay <78500760+0HyperCube@users.noreply.github.com> Date: Sat, 28 Jun 2025 02:32:14 +0100 Subject: [PATCH 33/44] Fix Shape tool custom color picker using gamma not linear space (#2773) Fix colour space for options --- editor/src/messages/tool/tool_messages/shape_tool.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/editor/src/messages/tool/tool_messages/shape_tool.rs b/editor/src/messages/tool/tool_messages/shape_tool.rs index 96dbc5ab01..5320000404 100644 --- a/editor/src/messages/tool/tool_messages/shape_tool.rs +++ b/editor/src/messages/tool/tool_messages/shape_tool.rs @@ -143,7 +143,7 @@ impl LayoutHolder for ShapeTool { true, |_| ShapeToolMessage::UpdateOptions(ShapeOptionsUpdate::FillColor(None)).into(), |color_type: ToolColorType| WidgetCallback::new(move |_| ShapeToolMessage::UpdateOptions(ShapeOptionsUpdate::FillColorType(color_type.clone())).into()), - |color: &ColorInput| ShapeToolMessage::UpdateOptions(ShapeOptionsUpdate::FillColor(color.value.as_solid())).into(), + |color: &ColorInput| ShapeToolMessage::UpdateOptions(ShapeOptionsUpdate::FillColor(color.value.as_solid().map(|color| color.to_linear_srgb()))).into(), )); widgets.push(Separator::new(SeparatorType::Unrelated).widget_holder()); @@ -154,7 +154,7 @@ impl LayoutHolder for ShapeTool { true, |_| ShapeToolMessage::UpdateOptions(ShapeOptionsUpdate::StrokeColor(None)).into(), |color_type: ToolColorType| WidgetCallback::new(move |_| ShapeToolMessage::UpdateOptions(ShapeOptionsUpdate::StrokeColorType(color_type.clone())).into()), - |color: &ColorInput| ShapeToolMessage::UpdateOptions(ShapeOptionsUpdate::StrokeColor(color.value.as_solid())).into(), + |color: &ColorInput| ShapeToolMessage::UpdateOptions(ShapeOptionsUpdate::StrokeColor(color.value.as_solid().map(|color| color.to_linear_srgb()))).into(), )); widgets.push(Separator::new(SeparatorType::Unrelated).widget_holder()); widgets.push(create_weight_widget(self.options.line_weight)); From 357e77077dcdc641b83fdd329901c9d520f5ddca Mon Sep 17 00:00:00 2001 From: Dennis Kobert Date: Sat, 28 Jun 2025 04:06:52 +0200 Subject: [PATCH 34/44] Only compute bounding box for layers being rendered by Vello when actually used (#2771) Only compute bounding box for vello when it is actually used Co-authored-by: Keavon Chambers --- node-graph/gsvg-renderer/src/renderer.rs | 32 +++++++++++++++--------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/node-graph/gsvg-renderer/src/renderer.rs b/node-graph/gsvg-renderer/src/renderer.rs index a1759f23e2..95e9890a86 100644 --- a/node-graph/gsvg-renderer/src/renderer.rs +++ b/node-graph/gsvg-renderer/src/renderer.rs @@ -289,19 +289,21 @@ impl GraphicElementRendered for GraphicGroupTable { let mut layer = false; - let bounds = self - .instance_ref_iter() - .filter_map(|element| element.instance.bounding_box(transform, true)) - .reduce(Quad::combine_bounds); - if let Some(bounds) = bounds { - let blend_mode = match render_params.view_mode { - ViewMode::Outline => peniko::Mix::Normal, - _ => alpha_blending.blend_mode.to_peniko(), - }; + let blend_mode = match render_params.view_mode { + ViewMode::Outline => peniko::Mix::Normal, + _ => alpha_blending.blend_mode.to_peniko(), + }; + let mut bounds = None; - let factor = if render_params.for_mask { 1. } else { alpha_blending.fill }; - let opacity = alpha_blending.opacity * factor; - if opacity < 1. || (render_params.view_mode != ViewMode::Outline && alpha_blending.blend_mode != BlendMode::default()) { + let factor = if render_params.for_mask { 1. } else { alpha_blending.fill }; + let opacity = alpha_blending.opacity * factor; + if opacity < 1. || (render_params.view_mode != ViewMode::Outline && alpha_blending.blend_mode != BlendMode::default()) { + bounds = self + .instance_ref_iter() + .filter_map(|element| element.instance.bounding_box(transform, true)) + .reduce(Quad::combine_bounds); + + if let Some(bounds) = bounds { scene.push_layer( peniko::BlendMode::new(blend_mode, peniko::Compose::SrcOver), opacity, @@ -321,6 +323,12 @@ impl GraphicElementRendered for GraphicGroupTable { if !next_clips { mask_instance_state = None; } + if !layer { + bounds = self + .instance_ref_iter() + .filter_map(|element| element.instance.bounding_box(transform, true)) + .reduce(Quad::combine_bounds); + } if let Some(bounds) = bounds { let rect = kurbo::Rect::new(bounds[0].x, bounds[0].y, bounds[1].x, bounds[1].y); From 62c7f88f5b600cc88732b8a14855d430cb78cb50 Mon Sep 17 00:00:00 2001 From: James Lindsay <78500760+0HyperCube@users.noreply.github.com> Date: Sat, 28 Jun 2025 03:37:37 +0100 Subject: [PATCH 35/44] Fix incorrectly calculating nonzero-area bounding boxes for empty raster images (#2772) No bounding box for empty rasters Co-authored-by: Keavon Chambers --- node-graph/gcore/src/raster_types.rs | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/node-graph/gcore/src/raster_types.rs b/node-graph/gcore/src/raster_types.rs index 0c34ba0c5e..4fb1fc4d52 100644 --- a/node-graph/gcore/src/raster_types.rs +++ b/node-graph/gcore/src/raster_types.rs @@ -57,6 +57,10 @@ impl Raster { let RasterStorage::Cpu(cpu) = self.data else { unreachable!() }; cpu } + pub fn is_empty(&self) -> bool { + let data = self.data(); + data.height == 0 || data.width == 0 + } } impl Default for Raster { fn default() -> Self { @@ -93,6 +97,10 @@ impl Raster { let RasterStorage::Gpu(gpu) = &self.data else { unreachable!() }; gpu.clone() } + pub fn is_empty(&self) -> bool { + let data = self.data(); + data.width() == 0 || data.height() == 0 + } } #[cfg(feature = "wgpu")] impl Deref for Raster { @@ -104,9 +112,23 @@ impl Deref for Raster { } pub type RasterDataTable = Instances>; -impl BoundingBox for RasterDataTable { +// TODO: Make this not dupliated +impl BoundingBox for RasterDataTable { fn bounding_box(&self, transform: DAffine2, _include_stroke: bool) -> Option<[DVec2; 2]> { self.instance_ref_iter() + .filter(|instance| !instance.instance.is_empty()) // Eliminate empty images + .flat_map(|instance| { + let transform = transform * *instance.transform; + (transform.matrix2.determinant() != 0.).then(|| (transform * Quad::from_box([DVec2::ZERO, DVec2::ONE])).bounding_box()) + }) + .reduce(Quad::combine_bounds) + } +} + +impl BoundingBox for RasterDataTable { + fn bounding_box(&self, transform: DAffine2, _include_stroke: bool) -> Option<[DVec2; 2]> { + self.instance_ref_iter() + .filter(|instance| !instance.instance.is_empty()) // Eliminate empty images .flat_map(|instance| { let transform = transform * *instance.transform; (transform.matrix2.determinant() != 0.).then(|| (transform * Quad::from_box([DVec2::ZERO, DVec2::ONE])).bounding_box()) From 532e91301796c45b271739e8f0a82d29ec3f3fa3 Mon Sep 17 00:00:00 2001 From: James Lindsay <78500760+0HyperCube@users.noreply.github.com> Date: Sat, 28 Jun 2025 03:59:03 +0100 Subject: [PATCH 36/44] Fix DropdownInput widget not reactively updating when its content changes (#2770) * Improve reactivity of DropdownInput.svelte * Fix formatting lint --------- Co-authored-by: Keavon Chambers --- .../src/components/widgets/inputs/DropdownInput.svelte | 9 ++++++++- node-graph/gcore/src/raster/image.rs | 10 +++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/widgets/inputs/DropdownInput.svelte b/frontend/src/components/widgets/inputs/DropdownInput.svelte index 6c45834848..4317a519f4 100644 --- a/frontend/src/components/widgets/inputs/DropdownInput.svelte +++ b/frontend/src/components/widgets/inputs/DropdownInput.svelte @@ -30,6 +30,7 @@ let open = false; $: watchSelectedIndex(selectedIndex); + $: watchEntries(entries); $: watchActiveEntry(activeEntry); $: watchOpen(open); @@ -38,7 +39,13 @@ } // Called only when `selectedIndex` is changed from outside this component - function watchSelectedIndex(_?: number) { + function watchSelectedIndex(_?: typeof selectedIndex) { + activeEntrySkipWatcher = true; + activeEntry = makeActiveEntry(); + } + + // Called only when `entries` is changed from outside this component + function watchEntries(_?: typeof entries) { activeEntrySkipWatcher = true; activeEntry = makeActiveEntry(); } diff --git a/node-graph/gcore/src/raster/image.rs b/node-graph/gcore/src/raster/image.rs index b3b708495a..e93fe60ba2 100644 --- a/node-graph/gcore/src/raster/image.rs +++ b/node-graph/gcore/src/raster/image.rs @@ -291,7 +291,15 @@ pub fn migrate_image_frame<'de, D: serde::Deserializer<'de>>(deserializer: D) -> *image_frame_table.instance_mut_iter().next().unwrap().alpha_blending = alpha_blending; image_frame_table } - FormatVersions::ImageFrame(image_frame) => RasterDataTable::new(Raster::new_cpu(image_frame.instance_ref_iter().next().unwrap().instance.image.clone())), + FormatVersions::ImageFrame(image_frame) => RasterDataTable::new(Raster::new_cpu( + image_frame + .instance_ref_iter() + .next() + .unwrap_or(Instances::new(ImageFrame::default()).instance_ref_iter().next().unwrap()) + .instance + .image + .clone(), + )), FormatVersions::ImageFrameTable(image_frame_table) => RasterDataTable::new(Raster::new_cpu(image_frame_table.instance_ref_iter().next().unwrap().instance.clone())), FormatVersions::RasterDataTable(raster_data_table) => raster_data_table, }) From a4fbea9193af2de1890686c9c15d7c5c46d07cf7 Mon Sep 17 00:00:00 2001 From: Hemu <1871299+hemu@users.noreply.github.com> Date: Sun, 29 Jun 2025 01:19:50 -0400 Subject: [PATCH 37/44] Fix lasso select extending the previous selection area after it was aborted (#2792) Fix lasso select extends previous path after abort --- editor/src/messages/tool/tool_messages/select_tool.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/editor/src/messages/tool/tool_messages/select_tool.rs b/editor/src/messages/tool/tool_messages/select_tool.rs index b524856eef..76158d08e5 100644 --- a/editor/src/messages/tool/tool_messages/select_tool.rs +++ b/editor/src/messages/tool/tool_messages/select_tool.rs @@ -1402,6 +1402,7 @@ impl Fsm for SelectToolFsmState { responses.add(DocumentMessage::AbortTransaction); tool_data.snap_manager.cleanup(responses); tool_data.axis_align = false; + tool_data.lasso_polygon.clear(); responses.add(OverlaysMessage::Draw); let selection = tool_data.nested_selection_behavior; @@ -1422,6 +1423,7 @@ impl Fsm for SelectToolFsmState { responses.add(DocumentMessage::AbortTransaction); tool_data.snap_manager.cleanup(responses); + tool_data.lasso_polygon.clear(); responses.add(OverlaysMessage::Draw); let selection = tool_data.nested_selection_behavior; From 391ed34a30e678ff879fb889334d29ed318c9357 Mon Sep 17 00:00:00 2001 From: Adesh Gupta <148623820+4adex@users.noreply.github.com> Date: Mon, 30 Jun 2025 11:49:54 +0530 Subject: [PATCH 38/44] Add segment editing mode to the Path tool (#2712) * Segment select mode upto dragging * Lasso select for segment editing * Formatting * Compatibility with point selection mode * Add delete segment support and drawing from inside of shape * Add GRS support for selected segments * Cleanup and add dynamic hints * Fix double click behaviour and overlays * Format code * Fix merge * Fix Lint * Fix formatting * Fix lasso bug * Code review --------- Co-authored-by: Keavon Chambers --- editor/Cargo.toml | 2 +- editor/src/consts.rs | 3 +- .../messages/input_mapper/input_mappings.rs | 2 +- .../document/overlays/utility_functions.rs | 15 +- .../document/overlays/utility_types.rs | 33 +- .../document/utility_types/transformation.rs | 12 + .../tool/common_functionality/shape_editor.rs | 224 +++++++--- .../common_functionality/utility_functions.rs | 81 +++- .../messages/tool/tool_messages/path_tool.rs | 397 ++++++++++++------ .../transform_layer_message_handler.rs | 23 +- frontend/assets/icon-12px-solid/dot.svg | 3 + frontend/src/utility-functions/icons.ts | 2 + node-graph/gcore/src/vector/vector_data.rs | 3 +- 13 files changed, 613 insertions(+), 187 deletions(-) create mode 100644 frontend/assets/icon-12px-solid/dot.svg diff --git a/editor/Cargo.toml b/editor/Cargo.toml index ffc95a9270..1f6af599ca 100644 --- a/editor/Cargo.toml +++ b/editor/Cargo.toml @@ -36,9 +36,9 @@ thiserror = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } bezier-rs = { workspace = true } +kurbo = { workspace = true } futures = { workspace = true } glam = { workspace = true } -kurbo = { workspace = true } derivative = { workspace = true } specta = { workspace = true } dyn-any = { workspace = true } diff --git a/editor/src/consts.rs b/editor/src/consts.rs index c943efe24b..9adba6d908 100644 --- a/editor/src/consts.rs +++ b/editor/src/consts.rs @@ -102,7 +102,7 @@ pub const MANIPULATOR_GROUP_MARKER_SIZE: f64 = 6.; pub const SELECTION_THRESHOLD: f64 = 10.; pub const HIDE_HANDLE_DISTANCE: f64 = 3.; pub const HANDLE_ROTATE_SNAP_ANGLE: f64 = 15.; -pub const SEGMENT_INSERTION_DISTANCE: f64 = 8.; +pub const SEGMENT_INSERTION_DISTANCE: f64 = 5.; pub const SEGMENT_OVERLAY_SIZE: f64 = 10.; pub const HANDLE_LENGTH_FACTOR: f64 = 0.5; @@ -133,6 +133,7 @@ pub const SCALE_EFFECT: f64 = 0.5; // COLORS pub const COLOR_OVERLAY_BLUE: &str = "#00a8ff"; +pub const COLOR_OVERLAY_BLUE_50: &str = "rgba(0, 168, 255, 0.5)"; pub const COLOR_OVERLAY_YELLOW: &str = "#ffc848"; pub const COLOR_OVERLAY_GREEN: &str = "#63ce63"; pub const COLOR_OVERLAY_RED: &str = "#ef5454"; diff --git a/editor/src/messages/input_mapper/input_mappings.rs b/editor/src/messages/input_mapper/input_mappings.rs index c2465d00d2..d24393031e 100644 --- a/editor/src/messages/input_mapper/input_mappings.rs +++ b/editor/src/messages/input_mapper/input_mappings.rs @@ -212,7 +212,7 @@ pub fn input_mappings() -> Mapping { entry!(KeyDown(Delete); modifiers=[Shift], action_dispatch=PathToolMessage::BreakPath), entry!(KeyDown(Backspace); modifiers=[Shift], action_dispatch=PathToolMessage::BreakPath), entry!(KeyDownNoRepeat(Tab); action_dispatch=PathToolMessage::SwapSelectedHandles), - entry!(KeyDown(MouseLeft); action_dispatch=PathToolMessage::MouseDown { extend_selection: Shift, lasso_select: Control, handle_drag_from_anchor: Alt, drag_restore_handle: Control }), + entry!(KeyDown(MouseLeft); action_dispatch=PathToolMessage::MouseDown { extend_selection: Shift, lasso_select: Control, handle_drag_from_anchor: Alt, drag_restore_handle: Control, molding_in_segment_edit: KeyA }), entry!(KeyDown(MouseRight); action_dispatch=PathToolMessage::RightClick), entry!(KeyDown(Escape); action_dispatch=PathToolMessage::Escape), entry!(KeyDown(KeyG); action_dispatch=PathToolMessage::GRS { key: KeyG }), diff --git a/editor/src/messages/portfolio/document/overlays/utility_functions.rs b/editor/src/messages/portfolio/document/overlays/utility_functions.rs index 92a16c9074..1e012b867a 100644 --- a/editor/src/messages/portfolio/document/overlays/utility_functions.rs +++ b/editor/src/messages/portfolio/document/overlays/utility_functions.rs @@ -124,8 +124,19 @@ pub fn path_overlays(document: &DocumentMessageHandler, draw_handles: DrawHandle overlay_context.outline_vector(&vector_data, transform); } + // Get the selected segments and then add a bold line overlay on them + for (segment_id, bezier, _, _) in vector_data.segment_bezier_iter() { + let Some(selected_shape_state) = shape_editor.selected_shape_state.get_mut(&layer) else { + continue; + }; + + if selected_shape_state.is_segment_selected(segment_id) { + overlay_context.outline_select_bezier(bezier, transform); + } + } + let selected = shape_editor.selected_shape_state.get(&layer); - let is_selected = |point: ManipulatorPointId| selected.is_some_and(|selected| selected.is_selected(point)); + let is_selected = |point: ManipulatorPointId| selected.is_some_and(|selected| selected.is_point_selected(point)); if display_handles { let opposite_handles_data: Vec<(PointId, SegmentId)> = shape_editor.selected_points().filter_map(|point_id| vector_data.adjacent_segment(point_id)).collect(); @@ -187,7 +198,7 @@ pub fn path_endpoint_overlays(document: &DocumentMessageHandler, shape_editor: & //let document_to_viewport = document.navigation_handler.calculate_offset_transform(overlay_context.size / 2., &document.document_ptz); let transform = document.metadata().transform_to_viewport(layer); let selected = shape_editor.selected_shape_state.get(&layer); - let is_selected = |selected: Option<&SelectedLayerState>, point: ManipulatorPointId| selected.is_some_and(|selected| selected.is_selected(point)); + let is_selected = |selected: Option<&SelectedLayerState>, point: ManipulatorPointId| selected.is_some_and(|selected| selected.is_point_selected(point)); for point in vector_data.extendable_points(preferences.vector_meshes) { let Some(position) = vector_data.point_domain.position_from_id(point) else { continue }; diff --git a/editor/src/messages/portfolio/document/overlays/utility_types.rs b/editor/src/messages/portfolio/document/overlays/utility_types.rs index 9587e1d637..a17d711a38 100644 --- a/editor/src/messages/portfolio/document/overlays/utility_types.rs +++ b/editor/src/messages/portfolio/document/overlays/utility_types.rs @@ -1,7 +1,7 @@ use super::utility_functions::overlay_canvas_context; use crate::consts::{ - COLOR_OVERLAY_BLUE, COLOR_OVERLAY_GREEN, COLOR_OVERLAY_RED, COLOR_OVERLAY_WHITE, COLOR_OVERLAY_YELLOW, COMPASS_ROSE_ARROW_SIZE, COMPASS_ROSE_HOVER_RING_DIAMETER, COMPASS_ROSE_MAIN_RING_DIAMETER, - COMPASS_ROSE_RING_INNER_DIAMETER, MANIPULATOR_GROUP_MARKER_SIZE, PIVOT_CROSSHAIR_LENGTH, PIVOT_CROSSHAIR_THICKNESS, PIVOT_DIAMETER, + COLOR_OVERLAY_BLUE, COLOR_OVERLAY_BLUE_50, COLOR_OVERLAY_GREEN, COLOR_OVERLAY_RED, COLOR_OVERLAY_WHITE, COLOR_OVERLAY_YELLOW, COMPASS_ROSE_ARROW_SIZE, COMPASS_ROSE_HOVER_RING_DIAMETER, + COMPASS_ROSE_MAIN_RING_DIAMETER, COMPASS_ROSE_RING_INNER_DIAMETER, MANIPULATOR_GROUP_MARKER_SIZE, PIVOT_CROSSHAIR_LENGTH, PIVOT_CROSSHAIR_THICKNESS, PIVOT_DIAMETER, }; use crate::messages::prelude::Message; use bezier_rs::{Bezier, Subpath}; @@ -581,6 +581,35 @@ impl OverlayContext { self.end_dpi_aware_transform(); } + /// Used by the path tool segment mode in order to show the selected segments. + pub fn outline_select_bezier(&mut self, bezier: Bezier, transform: DAffine2) { + self.start_dpi_aware_transform(); + + self.render_context.begin_path(); + self.bezier_command(bezier, transform, true); + self.render_context.set_stroke_style_str(COLOR_OVERLAY_BLUE); + self.render_context.set_line_width(4.); + self.render_context.stroke(); + + self.render_context.set_line_width(1.); + + self.end_dpi_aware_transform(); + } + + pub fn outline_overlay_bezier(&mut self, bezier: Bezier, transform: DAffine2) { + self.start_dpi_aware_transform(); + + self.render_context.begin_path(); + self.bezier_command(bezier, transform, true); + self.render_context.set_stroke_style_str(COLOR_OVERLAY_BLUE_50); + self.render_context.set_line_width(4.); + self.render_context.stroke(); + + self.render_context.set_line_width(1.); + + self.end_dpi_aware_transform(); + } + fn bezier_command(&self, bezier: Bezier, transform: DAffine2, move_to: bool) { self.start_dpi_aware_transform(); diff --git a/editor/src/messages/portfolio/document/utility_types/transformation.rs b/editor/src/messages/portfolio/document/utility_types/transformation.rs index a8aff38058..18e969e33c 100644 --- a/editor/src/messages/portfolio/document/utility_types/transformation.rs +++ b/editor/src/messages/portfolio/document/utility_types/transformation.rs @@ -88,6 +88,18 @@ impl OriginalTransforms { let Some(selected_points) = shape_editor.selected_points_in_layer(layer) else { continue; }; + let Some(selected_segments) = shape_editor.selected_segments_in_layer(layer) else { + continue; + }; + + let mut selected_points = selected_points.clone(); + + for (segment_id, _, start, end) in vector_data.segment_bezier_iter() { + if selected_segments.contains(&segment_id) { + selected_points.insert(ManipulatorPointId::Anchor(start)); + selected_points.insert(ManipulatorPointId::Anchor(end)); + } + } // Anchors also move their handles let anchor_ids = selected_points.iter().filter_map(|point| point.as_anchor()); diff --git a/editor/src/messages/tool/common_functionality/shape_editor.rs b/editor/src/messages/tool/common_functionality/shape_editor.rs index c1f7e99f08..24ce92a454 100644 --- a/editor/src/messages/tool/common_functionality/shape_editor.rs +++ b/editor/src/messages/tool/common_functionality/shape_editor.rs @@ -1,14 +1,15 @@ use super::graph_modification_utils::merge_layers; use super::snapping::{SnapCache, SnapCandidatePoint, SnapData, SnapManager, SnappedPoint}; -use super::utility_functions::{adjust_handle_colinearity, calculate_segment_angle, restore_g1_continuity, restore_previous_handle_position}; +use super::utility_functions::{adjust_handle_colinearity, calculate_bezier_bbox, calculate_segment_angle, restore_g1_continuity, restore_previous_handle_position}; use crate::consts::HANDLE_LENGTH_FACTOR; use crate::messages::portfolio::document::overlays::utility_functions::selected_segments; use crate::messages::portfolio::document::utility_types::document_metadata::{DocumentMetadata, LayerNodeIdentifier}; use crate::messages::portfolio::document::utility_types::misc::{PathSnapSource, SnapSource}; use crate::messages::portfolio::document::utility_types::network_interface::NodeNetworkInterface; +use crate::messages::preferences::SelectionMode; use crate::messages::prelude::*; use crate::messages::tool::common_functionality::snapping::SnapTypeConfiguration; -use crate::messages::tool::common_functionality::utility_functions::is_visible_point; +use crate::messages::tool::common_functionality::utility_functions::{is_intersecting, is_visible_point}; use crate::messages::tool::tool_messages::path_tool::{PathOverlayMode, PointSelectState}; use bezier_rs::{Bezier, BezierHandles, Subpath, TValue}; use glam::{DAffine2, DVec2}; @@ -45,6 +46,7 @@ pub enum ManipulatorAngle { #[derive(Clone, Debug, Default)] pub struct SelectedLayerState { selected_points: HashSet, + selected_segments: HashSet, /// Keeps track of the current state; helps avoid unnecessary computation when called by [`ShapeState`]. ignore_handles: bool, ignore_anchors: bool, @@ -54,11 +56,27 @@ pub struct SelectedLayerState { } impl SelectedLayerState { - pub fn selected(&self) -> impl Iterator + '_ { + pub fn selected_points(&self) -> impl Iterator + '_ { self.selected_points.iter().copied() } - pub fn is_selected(&self, point: ManipulatorPointId) -> bool { + pub fn selected_segments(&self) -> impl Iterator + '_ { + self.selected_segments.iter().copied() + } + + pub fn selected_points_count(&self) -> usize { + self.selected_points.len() + } + + pub fn selected_segments_count(&self) -> usize { + self.selected_segments.len() + } + + pub fn is_segment_selected(&self, segment: SegmentId) -> bool { + self.selected_segments.contains(&segment) + } + + pub fn is_point_selected(&self, point: ManipulatorPointId) -> bool { self.selected_points.contains(&point) } @@ -66,10 +84,26 @@ impl SelectedLayerState { self.selected_points.insert(point); } + pub fn select_segment(&mut self, segment: SegmentId) { + self.selected_segments.insert(segment); + } + pub fn deselect_point(&mut self, point: ManipulatorPointId) { self.selected_points.remove(&point); } + pub fn deselect_segment(&mut self, segment: SegmentId) { + self.selected_segments.remove(&segment); + } + + pub fn clear_points(&mut self) { + self.selected_points.clear(); + } + + pub fn clear_segments(&mut self) { + self.selected_segments.clear(); + } + pub fn ignore_handles(&mut self, status: bool) { if self.ignore_handles != status { return; @@ -101,14 +135,6 @@ impl SelectedLayerState { self.ignored_anchor_points.clear(); } } - - pub fn clear_points(&mut self) { - self.selected_points.clear(); - } - - pub fn selected_points_count(&self) -> usize { - self.selected_points.len() - } } pub type SelectedShapeState = HashMap; @@ -128,6 +154,12 @@ pub struct SelectedPointsInfo { pub vector_data: VectorData, } +#[derive(Debug)] +pub struct SelectedSegmentsInfo { + pub segments: Vec, + pub vector_data: VectorData, +} + #[derive(Clone, Copy, Debug, Eq, PartialEq)] pub struct ManipulatorPointInfo { pub layer: LayerNodeIdentifier, @@ -136,6 +168,7 @@ pub struct ManipulatorPointInfo { pub type OpposingHandleLengths = HashMap>; +#[derive(Clone)] pub struct ClosestSegment { layer: LayerNodeIdentifier, segment: SegmentId, @@ -159,6 +192,10 @@ impl ClosestSegment { self.points } + pub fn bezier(&self) -> Bezier { + self.bezier + } + pub fn closest_point_document(&self) -> DVec2 { self.bezier.evaluate(TValue::Parametric(self.t)) } @@ -473,7 +510,7 @@ impl ShapeState { if let Some(id) = selected.as_anchor() { for neighbor in vector_data.connected_points(id) { - if state.is_selected(ManipulatorPointId::Anchor(neighbor)) { + if state.is_point_selected(ManipulatorPointId::Anchor(neighbor)) { continue; } let Some(position) = vector_data.point_domain.position_from_id(neighbor) else { continue }; @@ -512,38 +549,30 @@ impl ShapeState { let point_position = manipulator_point_id.get_position(&vector_data)?; let selected_shape_state = self.selected_shape_state.get(&layer)?; - let already_selected = selected_shape_state.is_selected(manipulator_point_id); - - // Should we select or deselect the point? - let new_selected = if already_selected { !extend_selection } else { true }; + let already_selected = selected_shape_state.is_point_selected(manipulator_point_id); // Offset to snap the selected point to the cursor let offset = mouse_position - network_interface.document_metadata().transform_to_viewport(layer).transform_point2(point_position); // This is selecting the manipulator only for now, next to generalize to points - if new_selected { - let retain_existing_selection = extend_selection || already_selected; - if !retain_existing_selection { - self.deselect_all_points(); - } - // Add to the selected points - let selected_shape_state = self.selected_shape_state.get_mut(&layer)?; - selected_shape_state.select_point(manipulator_point_id); - - let points = self - .selected_shape_state - .iter() - .flat_map(|(layer, state)| state.selected_points.iter().map(|&point_id| ManipulatorPointInfo { layer: *layer, point_id })) - .collect(); - - return Some(Some(SelectedPointsInfo { points, offset, vector_data })); - } else { - let selected_shape_state = self.selected_shape_state.get_mut(&layer)?; - selected_shape_state.deselect_point(manipulator_point_id); - - return Some(None); + let retain_existing_selection = extend_selection || already_selected; + if !retain_existing_selection { + self.deselect_all_points(); + self.deselect_all_segments(); } + + // Add to the selected points (deselect is managed in DraggingState, DragStop) + let selected_shape_state = self.selected_shape_state.get_mut(&layer)?; + selected_shape_state.select_point(manipulator_point_id); + + let points = self + .selected_shape_state + .iter() + .flat_map(|(layer, state)| state.selected_points.iter().map(|&point_id| ManipulatorPointInfo { layer: *layer, point_id })) + .collect(); + + return Some(Some(SelectedPointsInfo { points, offset, vector_data })); } None } @@ -555,11 +584,16 @@ impl ShapeState { select_threshold: f64, path_overlay_mode: PathOverlayMode, frontier_handles_info: Option>>, + point_editing_mode: bool, ) -> Option<(bool, Option)> { if self.selected_shape_state.is_empty() { return None; } + if !point_editing_mode { + return None; + } + if let Some((layer, manipulator_point_id)) = self.find_nearest_point_indices(network_interface, mouse_position, select_threshold) { let vector_data = network_interface.compute_modified_vector(layer)?; let point_position = manipulator_point_id.get_position(&vector_data)?; @@ -572,7 +606,7 @@ impl ShapeState { } let selected_shape_state = self.selected_shape_state.get(&layer)?; - let already_selected = selected_shape_state.is_selected(manipulator_point_id); + let already_selected = selected_shape_state.is_point_selected(manipulator_point_id); // Offset to snap the selected point to the cursor let offset = mouse_position - network_interface.document_metadata().transform_to_viewport(layer).transform_point2(point_position); @@ -630,7 +664,7 @@ impl ShapeState { // Select all connected points while let Some(point) = selected_stack.pop() { let anchor_point = ManipulatorPointId::Anchor(point); - if !state.is_selected(anchor_point) { + if !state.is_point_selected(anchor_point) { state.select_point(anchor_point); selected_stack.extend(vector_data.connected_points(point)); } @@ -671,6 +705,13 @@ impl ShapeState { } } + /// Deselects all segments across every selected layer + pub fn deselect_all_segments(&mut self) { + for state in self.selected_shape_state.values_mut() { + state.selected_segments.clear() + } + } + pub fn update_selected_anchors_status(&mut self, status: bool) { for state in self.selected_shape_state.values_mut() { self.ignore_anchors = !status; @@ -736,10 +777,18 @@ impl ShapeState { self.selected_shape_state.values().flat_map(|state| &state.selected_points) } + pub fn selected_segments(&self) -> impl Iterator { + self.selected_shape_state.values().flat_map(|state| &state.selected_segments) + } + pub fn selected_points_in_layer(&self, layer: LayerNodeIdentifier) -> Option<&HashSet> { self.selected_shape_state.get(&layer).map(|state| &state.selected_points) } + pub fn selected_segments_in_layer(&self, layer: LayerNodeIdentifier) -> Option<&HashSet> { + self.selected_shape_state.get(&layer).map(|state| &state.selected_segments) + } + pub fn move_primary(&self, segment: SegmentId, delta: DVec2, layer: LayerNodeIdentifier, responses: &mut VecDeque) { responses.add(GraphOperationMessage::Vector { layer, @@ -766,7 +815,7 @@ impl ShapeState { let Some((start, _end, bezier)) = vector_data.segment_points_from_id(segment) else { continue }; if let BezierHandles::Quadratic { handle } = bezier.handles { - if selected.is_some_and(|selected| selected.is_selected(ManipulatorPointId::Anchor(start))) { + if selected.is_some_and(|selected| selected.is_point_selected(ManipulatorPointId::Anchor(start))) { continue; } @@ -1012,9 +1061,9 @@ impl ShapeState { } } - /// Move the selected points by dragging the mouse. + /// Move the selected points and segments by dragging the mouse. #[allow(clippy::too_many_arguments)] - pub fn move_selected_points( + pub fn move_selected_points_and_segments( &self, handle_lengths: Option, document: &DocumentMessageHandler, @@ -1040,7 +1089,17 @@ impl ShapeState { }; let delta = delta_transform.inverse().transform_vector2(delta); - for &point in state.selected_points.iter() { + // Make a new collection of anchor points which needs to be moved + let mut affected_points = state.selected_points.clone(); + + for (segment_id, _, start, end) in vector_data.segment_bezier_iter() { + if state.is_segment_selected(segment_id) { + affected_points.insert(ManipulatorPointId::Anchor(start)); + affected_points.insert(ManipulatorPointId::Anchor(end)); + } + } + + for &point in affected_points.iter() { if self.is_point_ignored(&point) { continue; } @@ -1055,7 +1114,7 @@ impl ShapeState { }; let Some(anchor_id) = point.get_anchor(&vector_data) else { continue }; - if state.is_selected(ManipulatorPointId::Anchor(anchor_id)) { + if state.is_point_selected(ManipulatorPointId::Anchor(anchor_id)) { continue; } @@ -1074,7 +1133,7 @@ impl ShapeState { continue; } - if state.is_selected(other.to_manipulator_point()) { + if state.is_point_selected(other.to_manipulator_point()) { // If two colinear handles are being dragged at the same time but not the anchor, it is necessary to break the colinear state. let handles = [handle, other]; let modification_type = VectorModificationType::SetG1Continuous { handles, enabled: false }; @@ -1125,12 +1184,12 @@ impl ShapeState { // ii) The anchor is not selected. let anchor = handles[0].to_manipulator_point().get_anchor(&vector_data)?; - let anchor_selected = state.is_selected(ManipulatorPointId::Anchor(anchor)); + let anchor_selected = state.is_point_selected(ManipulatorPointId::Anchor(anchor)); if anchor_selected { return None; } - let handles_selected = handles.map(|handle| state.is_selected(handle.to_manipulator_point())); + let handles_selected = handles.map(|handle| state.is_point_selected(handle.to_manipulator_point())); let other = match handles_selected { [true, false] => handles[1], @@ -1208,11 +1267,15 @@ impl ShapeState { continue; }; + let selected_segments = &state.selected_segments; + for point in std::mem::take(&mut state.selected_points) { match point { ManipulatorPointId::Anchor(anchor) => { if let Some(handles) = Self::dissolve_anchor(anchor, responses, layer, &vector_data) { - missing_anchors.insert(anchor, handles); + if !vector_data.all_connected(anchor).any(|a| selected_segments.contains(&a.segment)) { + missing_anchors.insert(anchor, handles); + } } deleted_anchors.insert(anchor); } @@ -1257,6 +1320,8 @@ impl ShapeState { continue; } + // Avoid reconnecting to points which have adjacent segments selected + // Grab the handles from the opposite side of the segment(s) being deleted and make it relative to the anchor let [handle_start, handle_end] = [start, end].map(|(handle, _)| { let handle = handle.opposite(); @@ -1304,6 +1369,20 @@ impl ShapeState { } } + pub fn delete_selected_segments(&mut self, document: &DocumentMessageHandler, responses: &mut VecDeque) { + for (&layer, state) in &self.selected_shape_state { + let Some(vector_data) = document.network_interface.compute_modified_vector(layer) else { + continue; + }; + + for (segment, _, start, end) in vector_data.segment_bezier_iter() { + if state.selected_segments.contains(&segment) { + self.dissolve_segment(responses, layer, &vector_data, segment, [start, end]); + } + } + } + } + pub fn break_path_at_selected_point(&self, document: &DocumentMessageHandler, responses: &mut VecDeque) { for (&layer, state) in &self.selected_shape_state { let Some(vector_data) = document.network_interface.compute_modified_vector(layer) else { continue }; @@ -1748,6 +1827,7 @@ impl ShapeState { false } + #[allow(clippy::too_many_arguments)] pub fn select_all_in_shape( &mut self, network_interface: &NodeNetworkInterface, @@ -1755,13 +1835,17 @@ impl ShapeState { selection_change: SelectionChange, path_overlay_mode: PathOverlayMode, frontier_handles_info: Option>>, + select_segments: bool, + // Here, "selection mode" represents touched or enclosed, not to be confused with editing modes + selection_mode: SelectionMode, ) { let selected_points = self.selected_points().cloned().collect::>(); let selected_segments = selected_segments(network_interface, self); for (&layer, state) in &mut self.selected_shape_state { if selection_change == SelectionChange::Clear { - state.clear_points() + state.clear_points(); + state.clear_segments(); } let vector_data = network_interface.compute_modified_vector(layer); @@ -1787,7 +1871,46 @@ impl ShapeState { None }; + // Selection segments for (id, bezier, _, _) in vector_data.segment_bezier_iter() { + if select_segments { + // Select segments if they lie inside the bounding box or lasso polygon + let segment_bbox = calculate_bezier_bbox(bezier); + let bottom_left = transform.transform_point2(segment_bbox[0]); + let top_right = transform.transform_point2(segment_bbox[1]); + + let select = match selection_shape { + SelectionShape::Box(quad) => { + let enclosed = quad[0].min(quad[1]).cmple(bottom_left).all() && quad[0].max(quad[1]).cmpge(top_right).all(); + match selection_mode { + SelectionMode::Enclosed => enclosed, + _ => { + // Check for intersection with the segment + enclosed || is_intersecting(bezier, quad, transform) + } + } + } + SelectionShape::Lasso(_) => { + let polygon = polygon_subpath.as_ref().expect("If `selection_shape` is a polygon then subpath is constructed beforehand."); + + // Sample 10 points on the bezier and check if all or some lie inside the polygon + let points = bezier.compute_lookup_table(Some(10), None); + match selection_mode { + SelectionMode::Enclosed => points.map(|p| transform.transform_point2(p)).all(|p| polygon.contains_point(p)), + _ => points.map(|p| transform.transform_point2(p)).any(|p| polygon.contains_point(p)), + } + } + }; + + if select { + match selection_change { + SelectionChange::Shrink => state.deselect_segment(id), + _ => state.select_segment(id), + } + } + } + + // Selecting handles for (position, id) in [(bezier.handle_start(), ManipulatorPointId::PrimaryHandle(id)), (bezier.handle_end(), ManipulatorPointId::EndHandle(id))] { let Some(position) = position else { continue }; let transformed_position = transform.transform_point2(position); @@ -1820,6 +1943,7 @@ impl ShapeState { } } + // Checking for selection of anchor points for (&id, &position) in vector_data.point_domain.ids().iter().zip(vector_data.point_domain.positions()) { let transformed_position = transform.transform_point2(position); diff --git a/editor/src/messages/tool/common_functionality/utility_functions.rs b/editor/src/messages/tool/common_functionality/utility_functions.rs index abe84224a1..b7b95123c0 100644 --- a/editor/src/messages/tool/common_functionality/utility_functions.rs +++ b/editor/src/messages/tool/common_functionality/utility_functions.rs @@ -8,11 +8,12 @@ use crate::messages::tool::common_functionality::graph_modification_utils::get_t use crate::messages::tool::common_functionality::transformation_cage::SelectedEdges; use crate::messages::tool::tool_messages::path_tool::PathOverlayMode; use crate::messages::tool::utility_types::ToolType; -use bezier_rs::Bezier; +use bezier_rs::{Bezier, BezierHandles}; use glam::{DAffine2, DVec2}; use graphene_std::renderer::Quad; use graphene_std::text::{FontCache, load_face}; use graphene_std::vector::{HandleExt, HandleId, ManipulatorPointId, PointId, SegmentId, VectorData, VectorModificationType}; +use kurbo::{CubicBez, Line, ParamCurveExtrema, PathSeg, Point, QuadBez}; /// Determines if a path should be extended. Goal in viewport space. Returns the path and if it is extending from the start, if applicable. pub fn should_extend( @@ -204,6 +205,71 @@ pub fn is_visible_point( } } +/// Function to find the bounding box of bezier (uses method from kurbo) +pub fn calculate_bezier_bbox(bezier: Bezier) -> [DVec2; 2] { + let start = Point::new(bezier.start.x, bezier.start.y); + let end = Point::new(bezier.end.x, bezier.end.y); + let bbox = match bezier.handles { + BezierHandles::Cubic { handle_start, handle_end } => { + let p1 = Point::new(handle_start.x, handle_start.y); + let p2 = Point::new(handle_end.x, handle_end.y); + CubicBez::new(start, p1, p2, end).bounding_box() + } + BezierHandles::Quadratic { handle } => { + let p1 = Point::new(handle.x, handle.y); + QuadBez::new(start, p1, end).bounding_box() + } + BezierHandles::Linear => Line::new(start, end).bounding_box(), + }; + [DVec2::new(bbox.x0, bbox.y0), DVec2::new(bbox.x1, bbox.y1)] +} + +pub fn is_intersecting(bezier: Bezier, quad: [DVec2; 2], transform: DAffine2) -> bool { + let to_layerspace = transform.inverse(); + let quad = [to_layerspace.transform_point2(quad[0]), to_layerspace.transform_point2(quad[1])]; + let start = Point::new(bezier.start.x, bezier.start.y); + let end = Point::new(bezier.end.x, bezier.end.y); + let segment = match bezier.handles { + BezierHandles::Cubic { handle_start, handle_end } => { + let p1 = Point::new(handle_start.x, handle_start.y); + let p2 = Point::new(handle_end.x, handle_end.y); + PathSeg::Cubic(CubicBez::new(start, p1, p2, end)) + } + BezierHandles::Quadratic { handle } => { + let p1 = Point::new(handle.x, handle.y); + PathSeg::Quad(QuadBez::new(start, p1, end)) + } + BezierHandles::Linear => PathSeg::Line(Line::new(start, end)), + }; + + // Create a list of all the sides + let sides = [ + Line::new((quad[0].x, quad[0].y), (quad[1].x, quad[0].y)), + Line::new((quad[0].x, quad[0].y), (quad[0].x, quad[1].y)), + Line::new((quad[1].x, quad[1].y), (quad[1].x, quad[0].y)), + Line::new((quad[1].x, quad[1].y), (quad[0].x, quad[1].y)), + ]; + + let mut is_intersecting = false; + for line in sides { + let intersections = segment.intersect_line(line); + let mut intersects = false; + for intersection in intersections { + if intersection.line_t <= 1. && intersection.line_t >= 0. && intersection.segment_t <= 1. && intersection.segment_t >= 0. { + // There is a valid intersection point + intersects = true; + break; + } + } + if intersects { + is_intersecting = true; + break; + } + } + is_intersecting +} + +#[allow(clippy::too_many_arguments)] pub fn resize_bounds( document: &DocumentMessageHandler, responses: &mut VecDeque, @@ -221,7 +287,7 @@ pub fn resize_bounds( let snap = Some(SizeSnapData { manager: snap_manager, points: snap_candidates, - snap_data: SnapData::ignore(document, input, &dragging_layers), + snap_data: SnapData::ignore(document, input, dragging_layers), }); let (position, size) = movement.new_size(input.mouse.position, bounds.original_bound_transform, center, constrain, snap); let (delta, mut pivot) = movement.bounds_to_scale_transform(position, size); @@ -238,11 +304,12 @@ pub fn resize_bounds( } }); - let mut selected = Selected::new(&mut bounds.original_transforms, &mut pivot, &dragging_layers, responses, &document.network_interface, None, &tool, None); + let mut selected = Selected::new(&mut bounds.original_transforms, &mut pivot, dragging_layers, responses, &document.network_interface, None, &tool, None); selected.apply_transformation(bounds.original_bound_transform * transformation * bounds.original_bound_transform.inverse(), None); } } +#[allow(clippy::too_many_arguments)] pub fn rotate_bounds( document: &DocumentMessageHandler, responses: &mut VecDeque, @@ -280,7 +347,7 @@ pub fn rotate_bounds( let mut selected = Selected::new( &mut bounds.original_transforms, &mut bounds.center_of_transformation, - &dragging_layers, + dragging_layers, responses, &document.network_interface, None, @@ -313,7 +380,7 @@ pub fn skew_bounds( } }); - let mut selected = Selected::new(&mut bounds.original_transforms, &mut pivot, &layers, responses, &document.network_interface, None, &tool, None); + let mut selected = Selected::new(&mut bounds.original_transforms, &mut pivot, layers, responses, &document.network_interface, None, &tool, None); selected.apply_transformation(bounds.original_bound_transform * transformation * bounds.original_bound_transform.inverse(), None); } } @@ -365,7 +432,7 @@ pub fn transforming_transform_cage( let mut selected = Selected::new( &mut bounds.original_transforms, &mut bounds.center_of_transformation, - &layers_dragging, + layers_dragging, responses, &document.network_interface, None, @@ -423,7 +490,7 @@ pub fn transforming_transform_cage( } // No resize, rotate, or skew - return (false, false, false); + (false, false, false) } /// Calculates similarity metric between new bezier curve and two old beziers by using sampled points. diff --git a/editor/src/messages/tool/tool_messages/path_tool.rs b/editor/src/messages/tool/tool_messages/path_tool.rs index 51c1fa579d..ff929ce9bd 100644 --- a/editor/src/messages/tool/tool_messages/path_tool.rs +++ b/editor/src/messages/tool/tool_messages/path_tool.rs @@ -32,6 +32,7 @@ pub struct PathTool { #[derive(Default)] pub struct PathToolOptions { path_overlay_mode: PathOverlayMode, + path_editing_mode: PathEditingMode, } #[impl_message(Message, ToolMessage, Path)] @@ -69,6 +70,7 @@ pub enum PathToolMessage { lasso_select: Key, handle_drag_from_anchor: Key, drag_restore_handle: Key, + molding_in_segment_edit: Key, }, NudgeSelectedPoints { delta_x: f64, @@ -116,9 +118,26 @@ pub enum PathOverlayMode { FrontierHandles = 2, } +#[derive(PartialEq, Eq, Hash, Copy, Clone, Debug)] +pub struct PathEditingMode { + point_editing_mode: bool, + segment_editing_mode: bool, +} + +impl Default for PathEditingMode { + fn default() -> Self { + Self { + point_editing_mode: true, + segment_editing_mode: false, + } + } +} + #[derive(PartialEq, Eq, Clone, Debug, Hash, serde::Serialize, serde::Deserialize, specta::Type)] pub enum PathOptionsUpdate { OverlayModeType(PathOverlayMode), + PointEditingMode { enabled: bool }, + SegmentEditingMode { enabled: bool }, } impl ToolMetadata for PathTool { @@ -203,6 +222,19 @@ impl LayoutHolder for PathTool { .for_checkbox(&mut checkbox_id) .widget_holder(); + let point_editing_mode = CheckboxInput::new(self.options.path_editing_mode.point_editing_mode) + // TODO(Keavon): Replace with a real icon + .icon("Dot") + .tooltip("Point Editing Mode") + .on_update(|input| PathToolMessage::UpdateOptions(PathOptionsUpdate::PointEditingMode { enabled: input.checked }).into()) + .widget_holder(); + let segment_editing_mode = CheckboxInput::new(self.options.path_editing_mode.segment_editing_mode) + // TODO(Keavon): Replace with a real icon + .icon("Remove") + .tooltip("Segment Editing Mode") + .on_update(|input| PathToolMessage::UpdateOptions(PathOptionsUpdate::SegmentEditingMode { enabled: input.checked }).into()) + .widget_holder(); + let path_overlay_mode_widget = RadioInput::new(vec![ RadioEntryData::new("all") .icon("HandleVisibilityAll") @@ -227,8 +259,12 @@ impl LayoutHolder for PathTool { y_location, unrelated_seperator.clone(), colinear_handle_checkbox, - related_seperator, + related_seperator.clone(), colinear_handles_label, + unrelated_seperator.clone(), + point_editing_mode, + related_seperator.clone(), + segment_editing_mode, unrelated_seperator, path_overlay_mode_widget, ], @@ -246,6 +282,14 @@ impl<'a> MessageHandler> for PathToo self.options.path_overlay_mode = overlay_mode_type; responses.add(OverlaysMessage::Draw); } + PathOptionsUpdate::PointEditingMode { enabled } => { + self.options.path_editing_mode.point_editing_mode = enabled; + responses.add(OverlaysMessage::Draw); + } + PathOptionsUpdate::SegmentEditingMode { enabled } => { + self.options.path_editing_mode.segment_editing_mode = enabled; + responses.add(OverlaysMessage::Draw); + } }, ToolMessage::Path(PathToolMessage::ClosePath) => { responses.add(DocumentMessage::AddTransaction); @@ -405,6 +449,7 @@ struct PathToolData { angle: f64, opposite_handle_position: Option, last_clicked_point_was_selected: bool, + last_clicked_segment_was_selected: bool, snapping_axis: Option, alt_clicked_on_anchor: bool, alt_dragging_from_anchor: bool, @@ -416,6 +461,7 @@ struct PathToolData { frontier_handles_info: Option>>, adjacent_anchor_offset: Option, sliding_point_info: Option, + started_drawing_from_inside: bool, } impl PathToolData { @@ -476,6 +522,7 @@ impl PathToolData { self.selection_status = selection_status; } + // TODO: This function is for basic point select mode. We definitely need to make a new one for the segment select mode. #[allow(clippy::too_many_arguments)] fn mouse_down( &mut self, @@ -487,7 +534,10 @@ impl PathToolData { lasso_select: bool, handle_drag_from_anchor: bool, drag_zero_handle: bool, + molding_in_segment_edit: bool, path_overlay_mode: PathOverlayMode, + segment_editing_mode: bool, + point_editing_mode: bool, ) -> PathToolFsmState { self.double_click_handled = false; self.opposing_handle_lengths = None; @@ -510,6 +560,7 @@ impl PathToolData { SELECTION_THRESHOLD, path_overlay_mode, self.frontier_handles_info.clone(), + point_editing_mode, ) { responses.add(DocumentMessage::StartTransaction); @@ -593,25 +644,51 @@ impl PathToolData { } PathToolFsmState::Dragging(self.dragging_state) } - // We didn't find a point nearby, so we will see if there is a segment to insert a point on - else if let Some(closed_segment) = &mut self.segment { + // We didn't find a point nearby, so we will see if there is a segment to select or insert a point on + else if let Some(segment) = shape_editor.upper_closest_segment(&document.network_interface, input.mouse.position, SELECTION_THRESHOLD) { responses.add(DocumentMessage::StartTransaction); - // Calculating and storing handle positions - let handle1 = ManipulatorPointId::PrimaryHandle(closed_segment.segment()); - let handle2 = ManipulatorPointId::EndHandle(closed_segment.segment()); + if segment_editing_mode && !molding_in_segment_edit { + let layer = segment.layer(); + let segment_id = segment.segment(); + let already_selected = shape_editor.selected_shape_state.get(&layer).is_some_and(|state| state.is_segment_selected(segment_id)); + self.last_clicked_segment_was_selected = already_selected; - if let Some(vector_data) = document.network_interface.compute_modified_vector(closed_segment.layer()) { - if let (Some(pos1), Some(pos2)) = (handle1.get_position(&vector_data), handle2.get_position(&vector_data)) { - self.molding_info = Some((pos1, pos2)) + if !(already_selected && extend_selection) { + let retain_existing_selection = extend_selection || already_selected; + if !retain_existing_selection { + shape_editor.deselect_all_segments(); + shape_editor.deselect_all_points(); + } + + // Add to selected segments + if let Some(selected_shape_state) = shape_editor.selected_shape_state.get_mut(&layer) { + selected_shape_state.select_segment(segment_id); + } } - } - PathToolFsmState::MoldingSegment + self.drag_start_pos = input.mouse.position; + + let viewport_to_document = document.metadata().document_to_viewport.inverse(); + self.previous_mouse_position = viewport_to_document.transform_point2(input.mouse.position); + + responses.add(OverlaysMessage::Draw); + PathToolFsmState::Dragging(self.dragging_state) + } else { + let handle1 = ManipulatorPointId::PrimaryHandle(segment.segment()); + let handle2 = ManipulatorPointId::EndHandle(segment.segment()); + if let Some(vector_data) = document.network_interface.compute_modified_vector(segment.layer()) { + if let (Some(pos1), Some(pos2)) = (handle1.get_position(&vector_data), handle2.get_position(&vector_data)) { + self.molding_info = Some((pos1, pos2)) + } + } + PathToolFsmState::MoldingSegment + } } - // We didn't find a segment, so consider selecting the nearest shape instead + // We didn't find a segment, so consider selecting the nearest shape instead and start drawing else if let Some(layer) = document.click(input) { shape_editor.deselect_all_points(); + shape_editor.deselect_all_segments(); if extend_selection { responses.add(NodeGraphMessage::SelectedNodesAdd { nodes: vec![layer.to_node()] }); } else { @@ -620,9 +697,10 @@ impl PathToolData { self.drag_start_pos = input.mouse.position; self.previous_mouse_position = document.metadata().document_to_viewport.inverse().transform_point2(input.mouse.position); - responses.add(DocumentMessage::StartTransaction); + self.started_drawing_from_inside = true; - PathToolFsmState::Dragging(self.dragging_state) + let selection_shape = if lasso_select { SelectionShapeType::Lasso } else { SelectionShapeType::Box }; + PathToolFsmState::Drawing { selection_shape } } // Start drawing else { @@ -644,7 +722,7 @@ impl PathToolData { let transform = document.metadata().transform_to_document(layer); let mut layer_manipulators = HashSet::with_hasher(NoHashBuilder); - for point in state.selected() { + for point in state.selected_points() { let Some(anchor) = point.get_anchor(&vector_data) else { continue }; layer_manipulators.insert(anchor); let Some([handle1, handle2]) = point.get_handle_pair(&vector_data) else { continue }; @@ -748,7 +826,7 @@ impl PathToolData { } // Only count selected handles - let selected_handle = selection.selected().next()?.as_handle()?; + let selected_handle = selection.selected_points().next()?.as_handle()?; let handle_id = selected_handle.to_manipulator_point(); let layer_to_document = document.metadata().transform_to_document(*layer); @@ -875,7 +953,7 @@ impl PathToolData { let drag_start = self.drag_start_pos; let opposite_delta = drag_start - current_mouse; - shape_editor.move_selected_points(None, document, opposite_delta, false, true, false, None, false, responses); + shape_editor.move_selected_points_and_segments(None, document, opposite_delta, false, true, false, None, false, responses); // Calculate the projected delta and shift the points along that delta let delta = current_mouse - drag_start; @@ -887,7 +965,7 @@ impl PathToolData { _ => DVec2::new(delta.x, 0.), }; - shape_editor.move_selected_points(None, document, projected_delta, false, true, false, None, false, responses); + shape_editor.move_selected_points_and_segments(None, document, projected_delta, false, true, false, None, false, responses); } fn stop_snap_along_axis(&mut self, shape_editor: &mut ShapeState, document: &DocumentMessageHandler, input: &InputPreprocessorMessageHandler, responses: &mut VecDeque) { @@ -903,12 +981,12 @@ impl PathToolData { _ => DVec2::new(opposite_delta.x, 0.), }; - shape_editor.move_selected_points(None, document, opposite_projected_delta, false, true, false, None, false, responses); + shape_editor.move_selected_points_and_segments(None, document, opposite_projected_delta, false, true, false, None, false, responses); // Calculate what actually would have been the original delta for the point, and apply that let delta = current_mouse - drag_start; - shape_editor.move_selected_points(None, document, delta, false, true, false, None, false, responses); + shape_editor.move_selected_points_and_segments(None, document, delta, false, true, false, None, false, responses); self.snapping_axis = None; } @@ -930,6 +1008,28 @@ impl PathToolData { tangent_vector.try_normalize() } + fn update_closest_segment(&mut self, shape_editor: &mut ShapeState, position: DVec2, document: &DocumentMessageHandler, path_overlay_mode: PathOverlayMode) { + // Check if there is no point nearby + if shape_editor + .find_nearest_visible_point_indices(&document.network_interface, position, SELECTION_THRESHOLD, path_overlay_mode, self.frontier_handles_info.clone()) + .is_some() + { + self.segment = None; + } + // If already hovering on a segment, then recalculate its closest point + else if let Some(closest_segment) = &mut self.segment { + closest_segment.update_closest_point(document.metadata(), position); + + if closest_segment.too_far(position, SEGMENT_INSERTION_DISTANCE) { + self.segment = None; + } + } + // If not, check that if there is some closest segment or not + else if let Some(closest_segment) = shape_editor.upper_closest_segment(&document.network_interface, position, SEGMENT_INSERTION_DISTANCE) { + self.segment = Some(closest_segment); + } + } + fn start_sliding_point(&mut self, shape_editor: &mut ShapeState, document: &DocumentMessageHandler) -> bool { let single_anchor_selected = shape_editor.selected_points().count() == 1 && shape_editor.selected_points().any(|point| matches!(point, ManipulatorPointId::Anchor(_))); @@ -1192,7 +1292,7 @@ impl PathToolData { self.temporary_colinear_handles = false; skip_opposite = true; } - shape_editor.move_selected_points(handle_lengths, document, snapped_delta, equidistant, true, was_alt_dragging, opposite, skip_opposite, responses); + shape_editor.move_selected_points_and_segments(handle_lengths, document, snapped_delta, equidistant, true, was_alt_dragging, opposite, skip_opposite, responses); self.previous_mouse_position += document_to_viewport.inverse().transform_vector2(snapped_delta); } else { let Some(axis) = self.snapping_axis else { return }; @@ -1201,7 +1301,7 @@ impl PathToolData { Axis::Y => DVec2::new(0., unsnapped_delta.y), _ => DVec2::new(unsnapped_delta.x, 0.), }; - shape_editor.move_selected_points(handle_lengths, document, projected_delta, equidistant, true, false, opposite, false, responses); + shape_editor.move_selected_points_and_segments(handle_lengths, document, projected_delta, equidistant, true, false, opposite, false, responses); self.previous_mouse_position += document_to_viewport.inverse().transform_vector2(unsnapped_delta); } @@ -1225,7 +1325,7 @@ impl Fsm for PathToolFsmState { fn transition(self, event: ToolMessage, tool_data: &mut Self::ToolData, tool_action_data: &mut ToolActionHandlerData, tool_options: &Self::ToolOptions, responses: &mut VecDeque) -> Self { let ToolActionHandlerData { document, input, shape_editor, .. } = tool_action_data; - update_dynamic_hints(self, responses, shape_editor, document, tool_data); + update_dynamic_hints(self, responses, shape_editor, document, tool_data, tool_options); let ToolMessage::Path(event) = event else { return self }; match (self, event) { @@ -1309,48 +1409,43 @@ impl Fsm for PathToolFsmState { match self { Self::Ready => { - // Check if there is no point nearby - if shape_editor - .find_nearest_visible_point_indices( - &document.network_interface, - input.mouse.position, - SELECTION_THRESHOLD, - tool_options.path_overlay_mode, - tool_data.frontier_handles_info.clone(), - ) - .is_some() - { - tool_data.segment = None; - } - // If already hovering on a segment, then recalculate its closest point - else if let Some(closest_segment) = &mut tool_data.segment { - closest_segment.update_closest_point(document.metadata(), input.mouse.position); - - if closest_segment.too_far(input.mouse.position, SEGMENT_INSERTION_DISTANCE) { - tool_data.segment = None; - } - } - // If not, check that if there is some closest segment or not - else if let Some(closest_segment) = shape_editor.upper_closest_segment(&document.network_interface, input.mouse.position, SEGMENT_INSERTION_DISTANCE) { - tool_data.segment = Some(closest_segment); - } + tool_data.update_closest_segment(shape_editor, input.mouse.position, document, tool_options.path_overlay_mode); if let Some(closest_segment) = &tool_data.segment { - let perp = closest_segment.calculate_perp(document); - let point = closest_segment.closest_point(document.metadata()); + if tool_options.path_editing_mode.segment_editing_mode { + let transform = document.metadata().transform_to_viewport(closest_segment.layer()); - // Draw an X on the segment - if tool_data.delete_segment_pressed { - let angle = 45_f64.to_radians(); - let tilted_line = DVec2::from_angle(angle).rotate(perp); - let tilted_perp = tilted_line.perp(); + overlay_context.outline_overlay_bezier(closest_segment.bezier(), transform); - overlay_context.line(point - tilted_line * SEGMENT_OVERLAY_SIZE, point + tilted_line * SEGMENT_OVERLAY_SIZE, Some(COLOR_OVERLAY_BLUE), None); - overlay_context.line(point - tilted_perp * SEGMENT_OVERLAY_SIZE, point + tilted_perp * SEGMENT_OVERLAY_SIZE, Some(COLOR_OVERLAY_BLUE), None); - } - // Draw a line on the segment - else { - overlay_context.line(point - perp * SEGMENT_OVERLAY_SIZE, point + perp * SEGMENT_OVERLAY_SIZE, Some(COLOR_OVERLAY_BLUE), None); + // Draw the anchors again + let display_anchors = overlay_context.visibility_settings.anchors(); + if display_anchors { + let start_pos = transform.transform_point2(closest_segment.bezier().start); + let end_pos = transform.transform_point2(closest_segment.bezier().end); + let start_id = closest_segment.points()[0]; + let end_id = closest_segment.points()[1]; + if let Some(shape_state) = shape_editor.selected_shape_state.get_mut(&closest_segment.layer()) { + overlay_context.manipulator_anchor(start_pos, shape_state.is_point_selected(ManipulatorPointId::Anchor(start_id)), None); + overlay_context.manipulator_anchor(end_pos, shape_state.is_point_selected(ManipulatorPointId::Anchor(end_id)), None); + } + } + } else { + let perp = closest_segment.calculate_perp(document); + let point = closest_segment.closest_point(document.metadata()); + + // Draw an X on the segment + if tool_data.delete_segment_pressed { + let angle = 45_f64.to_radians(); + let tilted_line = DVec2::from_angle(angle).rotate(perp); + let tilted_perp = tilted_line.perp(); + + overlay_context.line(point - tilted_line * SEGMENT_OVERLAY_SIZE, point + tilted_line * SEGMENT_OVERLAY_SIZE, Some(COLOR_OVERLAY_BLUE), None); + overlay_context.line(point - tilted_perp * SEGMENT_OVERLAY_SIZE, point + tilted_perp * SEGMENT_OVERLAY_SIZE, Some(COLOR_OVERLAY_BLUE), None); + } + // Draw a line on the segment + else { + overlay_context.line(point - perp * SEGMENT_OVERLAY_SIZE, point + perp * SEGMENT_OVERLAY_SIZE, Some(COLOR_OVERLAY_BLUE), None); + } } } } @@ -1370,11 +1465,13 @@ impl Fsm for PathToolFsmState { let quad = tool_data.selection_quad(document.metadata()); let polygon = &tool_data.lasso_polygon; - match (selection_shape, selection_mode) { - (SelectionShapeType::Box, SelectionMode::Enclosed) => overlay_context.dashed_quad(quad, None, fill_color, Some(4.), Some(4.), Some(0.5)), - (SelectionShapeType::Lasso, SelectionMode::Enclosed) => overlay_context.dashed_polygon(polygon, None, fill_color, Some(4.), Some(4.), Some(0.5)), - (SelectionShapeType::Box, _) => overlay_context.quad(quad, None, fill_color), - (SelectionShapeType::Lasso, _) => overlay_context.polygon(polygon, None, fill_color), + match (selection_shape, selection_mode, tool_data.started_drawing_from_inside) { + // Don't draw box if it is from inside a shape and selection just began + (SelectionShapeType::Box, SelectionMode::Enclosed, false) => overlay_context.dashed_quad(quad, None, fill_color, Some(4.), Some(4.), Some(0.5)), + (SelectionShapeType::Lasso, SelectionMode::Enclosed, _) => overlay_context.dashed_polygon(polygon, None, fill_color, Some(4.), Some(4.), Some(0.5)), + (SelectionShapeType::Box, _, false) => overlay_context.quad(quad, None, fill_color), + (SelectionShapeType::Lasso, _, _) => overlay_context.polygon(polygon, None, fill_color), + (SelectionShapeType::Box, _, _) => {} } } Self::Dragging(_) => { @@ -1420,12 +1517,14 @@ impl Fsm for PathToolFsmState { lasso_select, handle_drag_from_anchor, drag_restore_handle, + molding_in_segment_edit, }, ) => { let extend_selection = input.keyboard.get(extend_selection as usize); let lasso_select = input.keyboard.get(lasso_select as usize); let handle_drag_from_anchor = input.keyboard.get(handle_drag_from_anchor as usize); let drag_zero_handle = input.keyboard.get(drag_restore_handle as usize); + let molding_in_segment_edit = input.keyboard.get(molding_in_segment_edit as usize); tool_data.selection_mode = None; tool_data.lasso_polygon.clear(); @@ -1439,7 +1538,10 @@ impl Fsm for PathToolFsmState { lasso_select, handle_drag_from_anchor, drag_zero_handle, + molding_in_segment_edit, tool_options.path_overlay_mode, + tool_options.path_editing_mode.segment_editing_mode, + tool_options.path_editing_mode.point_editing_mode, ) } ( @@ -1455,6 +1557,7 @@ impl Fsm for PathToolFsmState { }, ) => { tool_data.previous_mouse_position = document.metadata().document_to_viewport.inverse().transform_point2(input.mouse.position); + tool_data.started_drawing_from_inside = false; if selection_shape == SelectionShapeType::Lasso { extend_lasso(&mut tool_data.lasso_polygon, input.mouse.position); @@ -1516,12 +1619,6 @@ impl Fsm for PathToolFsmState { tool_data.handle_drag_toggle = true; } - if tool_data.selection_status.is_none() { - if let Some(layer) = document.click(input) { - shape_editor.select_all_anchors_in_layer(document, layer); - } - } - let anchor_and_handle_toggled = input.keyboard.get(move_anchor_with_handles as usize); let initial_press = anchor_and_handle_toggled && !tool_data.select_anchor_toggled; let released_from_toggle = tool_data.select_anchor_toggled && !anchor_and_handle_toggled; @@ -1707,6 +1804,11 @@ impl Fsm for PathToolFsmState { if tool_data.drag_start_pos == previous_mouse { responses.add(NodeGraphMessage::SelectedNodesSet { nodes: vec![] }); } else { + let selection_mode = match tool_action_data.preferences.get_selection_mode() { + SelectionMode::Directional => tool_data.calculate_selection_mode_from_direction(document.metadata()), + selection_mode => selection_mode, + }; + match selection_shape { SelectionShapeType::Box => { let bbox = [tool_data.drag_start_pos, previous_mouse]; @@ -1716,6 +1818,8 @@ impl Fsm for PathToolFsmState { selection_change, tool_options.path_overlay_mode, tool_data.frontier_handles_info.clone(), + tool_options.path_editing_mode.segment_editing_mode, + selection_mode, ); } SelectionShapeType::Lasso => shape_editor.select_all_in_shape( @@ -1724,6 +1828,8 @@ impl Fsm for PathToolFsmState { selection_change, tool_options.path_overlay_mode, tool_data.frontier_handles_info.clone(), + tool_options.path_editing_mode.segment_editing_mode, + selection_mode, ), } } @@ -1735,6 +1841,7 @@ impl Fsm for PathToolFsmState { (PathToolFsmState::Dragging { .. }, PathToolMessage::Escape | PathToolMessage::RightClick) => { if tool_data.handle_drag_toggle && tool_data.drag_start_pos.distance(input.mouse.position) > DRAG_THRESHOLD { shape_editor.deselect_all_points(); + shape_editor.deselect_all_segments(); shape_editor.select_points_by_manipulator_id(&tool_data.saved_points_before_handle_drag); tool_data.saved_points_before_handle_drag.clear(); @@ -1783,8 +1890,17 @@ impl Fsm for PathToolFsmState { let document_to_viewport = document.metadata().document_to_viewport; let previous_mouse = document_to_viewport.transform_point2(tool_data.previous_mouse_position); - if tool_data.drag_start_pos == previous_mouse { - responses.add(NodeGraphMessage::SelectedNodesSet { nodes: vec![] }); + + let selection_mode = match tool_action_data.preferences.get_selection_mode() { + SelectionMode::Directional => tool_data.calculate_selection_mode_from_direction(document.metadata()), + selection_mode => selection_mode, + }; + + if tool_data.drag_start_pos.distance(previous_mouse) < 1e-8 { + // If click happens inside of a shape then don't set selected nodes to empty + if document.click(input).is_none() { + responses.add(NodeGraphMessage::SelectedNodesSet { nodes: vec![] }); + } } else { match selection_shape { SelectionShapeType::Box => { @@ -1795,6 +1911,8 @@ impl Fsm for PathToolFsmState { select_kind, tool_options.path_overlay_mode, tool_data.frontier_handles_info.clone(), + tool_options.path_editing_mode.segment_editing_mode, + selection_mode, ); } SelectionShapeType::Lasso => shape_editor.select_all_in_shape( @@ -1803,6 +1921,8 @@ impl Fsm for PathToolFsmState { select_kind, tool_options.path_overlay_mode, tool_data.frontier_handles_info.clone(), + tool_options.path_editing_mode.segment_editing_mode, + selection_mode, ), } } @@ -1823,32 +1943,31 @@ impl Fsm for PathToolFsmState { tool_data.frontier_handles_info.clone(), ); + let nearest_segment = tool_data.segment.clone(); + if let Some(segment) = &mut tool_data.segment { - if !drag_occurred && !tool_data.molding_segment { + let segment_mode = tool_options.path_editing_mode.segment_editing_mode; + if !drag_occurred && !tool_data.molding_segment && !segment_mode { if tool_data.delete_segment_pressed { if let Some(vector_data) = document.network_interface.compute_modified_vector(segment.layer()) { shape_editor.dissolve_segment(responses, segment.layer(), &vector_data, segment.segment(), segment.points()); - responses.add(DocumentMessage::EndTransaction); } } else { segment.adjusted_insert_and_select(shape_editor, responses, extend_selection); - responses.add(DocumentMessage::EndTransaction); } - } else { - responses.add(DocumentMessage::EndTransaction); } tool_data.segment = None; tool_data.molding_info = None; tool_data.molding_segment = false; tool_data.temporary_adjacent_handles_while_molding = None; - - return PathToolFsmState::Ready; } + let segment_mode = tool_options.path_editing_mode.segment_editing_mode; + if let Some((layer, nearest_point)) = nearest_point { + let clicked_selected = shape_editor.selected_points().any(|&point| nearest_point == point); if !drag_occurred && extend_selection { - let clicked_selected = shape_editor.selected_points().any(|&point| nearest_point == point); if clicked_selected && tool_data.last_clicked_point_was_selected { shape_editor.selected_shape_state.entry(layer).or_default().deselect_point(nearest_point); } else { @@ -1856,6 +1975,49 @@ impl Fsm for PathToolFsmState { } responses.add(OverlaysMessage::Draw); } + if !drag_occurred && !extend_selection && clicked_selected { + if tool_data.saved_points_before_anchor_convert_smooth_sharp.is_empty() { + tool_data.saved_points_before_anchor_convert_smooth_sharp = shape_editor.selected_points().copied().collect::>(); + } + + shape_editor.deselect_all_points(); + shape_editor.deselect_all_segments(); + + shape_editor.selected_shape_state.entry(layer).or_default().select_point(nearest_point); + + responses.add(OverlaysMessage::Draw); + } + } + // Segment editing mode + else if let Some(nearest_segment) = nearest_segment { + if segment_mode { + let clicked_selected = shape_editor.selected_segments().any(|&segment| segment == nearest_segment.segment()); + if !drag_occurred && extend_selection { + if clicked_selected && tool_data.last_clicked_segment_was_selected { + shape_editor + .selected_shape_state + .entry(nearest_segment.layer()) + .or_default() + .deselect_segment(nearest_segment.segment()); + } else { + shape_editor.selected_shape_state.entry(nearest_segment.layer()).or_default().select_segment(nearest_segment.segment()); + } + + responses.add(OverlaysMessage::Draw); + } + if !drag_occurred && !extend_selection && clicked_selected { + shape_editor.deselect_all_segments(); + shape_editor.deselect_all_points(); + shape_editor.selected_shape_state.entry(nearest_segment.layer()).or_default().select_segment(nearest_segment.segment()); + + responses.add(OverlaysMessage::Draw); + } + } + } + // Deselect all points if the user clicks the filled region of the shape + else if tool_data.drag_start_pos.distance(input.mouse.position) <= DRAG_THRESHOLD { + shape_editor.deselect_all_points(); + shape_editor.deselect_all_segments(); } if tool_data.temporary_colinear_handles { @@ -1881,25 +2043,6 @@ impl Fsm for PathToolFsmState { tool_data.select_anchor_toggled = false; } - if let Some((layer, nearest_point)) = nearest_point { - if !drag_occurred && !extend_selection { - let clicked_selected = shape_editor.selected_points().any(|&point| nearest_point == point); - if clicked_selected { - if tool_data.saved_points_before_anchor_convert_smooth_sharp.is_empty() { - tool_data.saved_points_before_anchor_convert_smooth_sharp = shape_editor.selected_points().copied().collect::>(); - } - - shape_editor.deselect_all_points(); - shape_editor.selected_shape_state.entry(layer).or_default().select_point(nearest_point); - responses.add(OverlaysMessage::Draw); - } - } - } - // Deselect all points if the user clicks the filled region of the shape - else if tool_data.drag_start_pos.distance(input.mouse.position) <= DRAG_THRESHOLD { - shape_editor.deselect_all_points(); - } - tool_data.snapping_axis = None; tool_data.sliding_point_info = None; @@ -1915,6 +2058,7 @@ impl Fsm for PathToolFsmState { (_, PathToolMessage::Delete) => { // Delete the selected points and clean up overlays responses.add(DocumentMessage::AddTransaction); + shape_editor.delete_selected_segments(document, responses); shape_editor.delete_selected_points(document, responses); responses.add(PathToolMessage::SelectionChanged); @@ -1951,6 +2095,7 @@ impl Fsm for PathToolFsmState { if let Some(layer) = document.click(input) { // Select all points in the layer shape_editor.select_connected_anchors(document, layer, input.mouse.position); + responses.add(OverlaysMessage::Draw); } PathToolFsmState::Ready @@ -1960,7 +2105,7 @@ impl Fsm for PathToolFsmState { PathToolFsmState::Ready } (_, PathToolMessage::NudgeSelectedPoints { delta_x, delta_y }) => { - shape_editor.move_selected_points( + shape_editor.move_selected_points_and_segments( tool_data.opposing_handle_lengths.take(), document, (delta_x, delta_y).into(), @@ -2040,10 +2185,6 @@ enum SelectionStatus { } impl SelectionStatus { - fn is_none(&self) -> bool { - self == &SelectionStatus::None - } - fn as_one(&self) -> Option<&SingleSelectedPoint> { match self { SelectionStatus::One(one) => Some(one), @@ -2173,9 +2314,7 @@ fn calculate_lock_angle( } fn check_handle_over_adjacent_anchor(handle_id: ManipulatorPointId, vector_data: &VectorData) -> Option { - let Some((anchor, handle_position)) = handle_id.get_anchor(&vector_data).zip(handle_id.get_position(vector_data)) else { - return None; - }; + let (anchor, handle_position) = handle_id.get_anchor(vector_data).zip(handle_id.get_position(vector_data))?; let check_if_close = |point_id: &PointId| { let Some(anchor_position) = vector_data.point_domain.position_from_id(*point_id) else { @@ -2184,7 +2323,7 @@ fn check_handle_over_adjacent_anchor(handle_id: ManipulatorPointId, vector_data: (anchor_position - handle_position).length() < 10. }; - vector_data.connected_points(anchor).find(|point| check_if_close(point)) + vector_data.connected_points(anchor).find(check_if_close) } fn calculate_adjacent_anchor_tangent( currently_dragged_handle: ManipulatorPointId, @@ -2240,7 +2379,7 @@ fn calculate_adjacent_anchor_tangent( }; let angle = shared_segment_handle - .get_position(&vector_data) + .get_position(vector_data) .zip(adjacent_anchor_position) .map(|(handle, anchor)| -(handle - anchor).angle_to(DVec2::X)); @@ -2251,7 +2390,14 @@ fn calculate_adjacent_anchor_tangent( } } -fn update_dynamic_hints(state: PathToolFsmState, responses: &mut VecDeque, shape_editor: &mut ShapeState, document: &DocumentMessageHandler, tool_data: &PathToolData) { +fn update_dynamic_hints( + state: PathToolFsmState, + responses: &mut VecDeque, + shape_editor: &mut ShapeState, + document: &DocumentMessageHandler, + tool_data: &PathToolData, + tool_options: &PathToolOptions, +) { // Condinting based on currently selected segment if it has any one g1 continuous handle let hint_data = match state { @@ -2285,12 +2431,27 @@ fn update_dynamic_hints(state: PathToolFsmState, responses: &mut VecDeque { + vec![ + HintGroup(vec![HintInfo::mouse(MouseMotion::Lmb, "Select Segment"), HintInfo::keys([Key::Shift], "Extend").prepend_plus()]), + HintGroup(vec![HintInfo::keys_and_mouse([Key::KeyA], MouseMotion::Lmb, "Mold Segment")]), + ] + } + (true, false) => { + vec![ + HintGroup(vec![HintInfo::mouse(MouseMotion::Lmb, "Insert Point on Segment")]), + HintGroup(vec![HintInfo::mouse(MouseMotion::LmbDrag, "Mold Segment")]), + HintGroup(vec![HintInfo::keys_and_mouse([Key::Alt], MouseMotion::Lmb, "Delete Segment")]), + ] + } + (false, _) => { + vec![ + HintGroup(vec![HintInfo::mouse(MouseMotion::Lmb, "Select Point"), HintInfo::keys([Key::Shift], "Extend").prepend_plus()]), + HintGroup(vec![HintInfo::mouse(MouseMotion::LmbDrag, "Select Area"), HintInfo::keys([Key::Control], "Lasso").prepend_plus()]), + ] + } + }; if at_least_one_anchor_selected { // TODO: Dynamically show either "Smooth" or "Sharp" based on the current state diff --git a/editor/src/messages/tool/transform_layer/transform_layer_message_handler.rs b/editor/src/messages/tool/transform_layer/transform_layer_message_handler.rs index 287faf00d1..104f1a66a8 100644 --- a/editor/src/messages/tool/transform_layer/transform_layer_message_handler.rs +++ b/editor/src/messages/tool/transform_layer/transform_layer_message_handler.rs @@ -180,14 +180,28 @@ impl MessageHandler> for TransformLayer *selected.pivot = selected.mean_average_of_pivots(); self.local_pivot = document.metadata().document_to_viewport.inverse().transform_point2(*selected.pivot); self.grab_target = document.metadata().document_to_viewport.inverse().transform_point2(selected.mean_average_of_pivots()); - } else if let Some(vector_data) = selected_layers.first().and_then(|&layer| document.network_interface.compute_modified_vector(layer)) { + } + // Here vector data from all layers is not considered which can be a problem in pivot calculation + else if let Some(vector_data) = selected_layers.first().and_then(|&layer| document.network_interface.compute_modified_vector(layer)) { *selected.original_transforms = OriginalTransforms::default(); let viewspace = document.metadata().transform_to_viewport(selected_layers[0]); - let selected_points = shape_editor.selected_points().collect::>(); + + let selected_segments = shape_editor.selected_segments().collect::>(); + + let mut affected_points = shape_editor.selected_points().copied().collect::>(); + + for (segment_id, _, start, end) in vector_data.segment_bezier_iter() { + if selected_segments.contains(&segment_id) { + affected_points.push(ManipulatorPointId::Anchor(start)); + affected_points.push(ManipulatorPointId::Anchor(end)); + } + } + + let affected_point_refs = affected_points.iter().collect(); let get_location = |point: &&ManipulatorPointId| point.get_position(&vector_data).map(|position| viewspace.transform_point2(position)); - if let Some((new_pivot, grab_target)) = calculate_pivot(&selected_points, &vector_data, viewspace, |point: &ManipulatorPointId| get_location(&point)) { + if let Some((new_pivot, grab_target)) = calculate_pivot(&affected_point_refs, &vector_data, viewspace, |point: &ManipulatorPointId| get_location(&point)) { *selected.pivot = new_pivot; self.local_pivot = document_to_viewport.inverse().transform_point2(*selected.pivot); @@ -390,7 +404,8 @@ impl MessageHandler> for TransformLayer } TransformLayerMessage::BeginGRS { transform_type } => { let selected_points: Vec<&ManipulatorPointId> = shape_editor.selected_points().collect(); - if (using_path_tool && selected_points.is_empty()) + let selected_segments = shape_editor.selected_segments().collect::>(); + if (using_path_tool && selected_points.is_empty() && selected_segments.is_empty()) || (!using_path_tool && !using_select_tool && !using_pen_tool && !using_shape_tool) || selected_layers.is_empty() || transform_type.equivalent_to(self.transform_operation) diff --git a/frontend/assets/icon-12px-solid/dot.svg b/frontend/assets/icon-12px-solid/dot.svg new file mode 100644 index 0000000000..63f4a4e05d --- /dev/null +++ b/frontend/assets/icon-12px-solid/dot.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/src/utility-functions/icons.ts b/frontend/src/utility-functions/icons.ts index d3f7584c94..3e57c4acd6 100644 --- a/frontend/src/utility-functions/icons.ts +++ b/frontend/src/utility-functions/icons.ts @@ -13,6 +13,7 @@ import Checkmark from "@graphite-frontend/assets/icon-12px-solid/checkmark.svg"; import Clipped from "@graphite-frontend/assets/icon-12px-solid/clipped.svg"; import CloseX from "@graphite-frontend/assets/icon-12px-solid/close-x.svg"; import Delay from "@graphite-frontend/assets/icon-12px-solid/delay.svg"; +import Dot from "@graphite-frontend/assets/icon-12px-solid/dot.svg"; import DropdownArrow from "@graphite-frontend/assets/icon-12px-solid/dropdown-arrow.svg"; import Edit12px from "@graphite-frontend/assets/icon-12px-solid/edit-12px.svg"; import Empty12px from "@graphite-frontend/assets/icon-12px-solid/empty-12px.svg"; @@ -55,6 +56,7 @@ const SOLID_12PX = { Clipped: { svg: Clipped, size: 12 }, CloseX: { svg: CloseX, size: 12 }, Delay: { svg: Delay, size: 12 }, + Dot: { svg: Dot, size: 12 }, DropdownArrow: { svg: DropdownArrow, size: 12 }, Edit12px: { svg: Edit12px, size: 12 }, Empty12px: { svg: Empty12px, size: 12 }, diff --git a/node-graph/gcore/src/vector/vector_data.rs b/node-graph/gcore/src/vector/vector_data.rs index 4a6a66034a..ed7c32db3b 100644 --- a/node-graph/gcore/src/vector/vector_data.rs +++ b/node-graph/gcore/src/vector/vector_data.rs @@ -12,12 +12,13 @@ use crate::vector::click_target::{ClickTargetType, FreePoint}; use crate::{AlphaBlending, Color, GraphicGroupTable}; pub use attributes::*; use bezier_rs::ManipulatorGroup; +use core::borrow::Borrow; +use core::hash::Hash; use dyn_any::DynAny; use glam::{DAffine2, DVec2}; pub use indexed::VectorDataIndex; use kurbo::{Affine, Rect, Shape}; pub use modification::*; -use std::borrow::Borrow; use std::collections::HashMap; // TODO: Eventually remove this migration document upgrade code From 59e34836cd51fae26996c7ec44a960efcb5f0dc1 Mon Sep 17 00:00:00 2001 From: Firestar99 Date: Mon, 30 Jun 2025 08:49:00 +0200 Subject: [PATCH 39/44] Fix the 'Split Coordinate' node that was broken in an earlier refactor commit (#2787) fix "Split Coordinate" node --- .../document/node_graph/document_node_definitions.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs b/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs index b9b04a2436..c426ac85a1 100644 --- a/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs +++ b/editor/src/messages/portfolio/document/node_graph/document_node_definitions.rs @@ -960,13 +960,13 @@ fn static_nodes() -> Vec { nodes: [ DocumentNode { inputs: vec![NodeInput::network(concrete!(RasterDataTable), 0), NodeInput::value(TaggedValue::XY(XY::X), false)], - implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::ops::ExtractXyNode")), + implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::extract_xy::ExtractXyNode")), manual_composition: Some(generic!(T)), ..Default::default() }, DocumentNode { inputs: vec![NodeInput::network(concrete!(RasterDataTable), 0), NodeInput::value(TaggedValue::XY(XY::Y), false)], - implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::ops::ExtractXyNode")), + implementation: DocumentNodeImplementation::ProtoNode(ProtoNodeIdentifier::new("graphene_core::extract_xy::ExtractXyNode")), manual_composition: Some(generic!(T)), ..Default::default() }, From 71ddae902811e986aea277dfc203794247f8742e Mon Sep 17 00:00:00 2001 From: 0SlowPoke0 <142654792+0SlowPoke0@users.noreply.github.com> Date: Mon, 30 Jun 2025 13:26:22 +0530 Subject: [PATCH 40/44] Fix Path tool multi-point handle scaling behavior and double-click smooth/sharp conversion on rectangles (#2765) * fixed double-click on anchor connected to linear segments * fix when scaling when anchor * Nit --------- Co-authored-by: Keavon Chambers --- .../portfolio/document/utility_types/transformation.rs | 6 ++---- .../messages/tool/common_functionality/shape_editor.rs | 10 ++++++++-- node-graph/gcore/src/vector/vector_data.rs | 9 ++++++++- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/editor/src/messages/portfolio/document/utility_types/transformation.rs b/editor/src/messages/portfolio/document/utility_types/transformation.rs index 18e969e33c..e0149939a5 100644 --- a/editor/src/messages/portfolio/document/utility_types/transformation.rs +++ b/editor/src/messages/portfolio/document/utility_types/transformation.rs @@ -9,9 +9,7 @@ use crate::messages::tool::common_functionality::shape_editor::ShapeState; use crate::messages::tool::utility_types::ToolType; use glam::{DAffine2, DMat2, DVec2}; use graphene_std::renderer::Quad; -use graphene_std::vector::VectorModificationType; -use graphene_std::vector::{HandleExt, ManipulatorPointId}; -use graphene_std::vector::{HandleId, PointId}; +use graphene_std::vector::{HandleExt, HandleId, ManipulatorPointId, PointId, VectorModificationType}; use std::collections::{HashMap, VecDeque}; use std::f64::consts::PI; @@ -616,7 +614,7 @@ impl<'a> Selected<'a> { responses.add(GraphOperationMessage::Vector { layer, modification_type }); } - if transform_operation.is_some_and(|transform_operation| matches!(transform_operation, TransformOperation::Scaling(_))) && initial_points.anchors.len() > 1 { + if transform_operation.is_some_and(|transform_operation| matches!(transform_operation, TransformOperation::Scaling(_))) && (initial_points.anchors.len() == 2) { return; } diff --git a/editor/src/messages/tool/common_functionality/shape_editor.rs b/editor/src/messages/tool/common_functionality/shape_editor.rs index 24ce92a454..b491e0943d 100644 --- a/editor/src/messages/tool/common_functionality/shape_editor.rs +++ b/editor/src/messages/tool/common_functionality/shape_editor.rs @@ -899,6 +899,9 @@ impl ShapeState { let non_zero_handles = handles.iter().filter(|handle| handle.length(vector_data) > 1e-6).count(); let handle_segments = handles.iter().map(|handles| handles.segment).collect::>(); + // Check if the anchor is connected to linear segments and has no handles + let linear_segments = vector_data.connected_linear_segments(point_id) != 0; + // Grab the next and previous manipulator groups by simply looking at the next / previous index let points = handles.iter().map(|handle| vector_data.other_point(handle.segment, point_id)); let anchor_positions = points @@ -940,7 +943,7 @@ impl ShapeState { handle_direction *= -1.; } - if non_zero_handles != 0 { + if non_zero_handles != 0 && !linear_segments { let [a, b] = handles.as_slice() else { return }; let (non_zero_handle, zero_handle) = if a.length(vector_data) > 1e-6 { (a, b) } else { (b, a) }; let Some(direction) = non_zero_handle @@ -1772,10 +1775,13 @@ impl ShapeState { .filter(|&handle| anchor.abs_diff_eq(handle, 1e-5)) .count(); + // Check if the anchor is connected to linear segments. + let one_or_more_segment_linear = vector_data.connected_linear_segments(id) != 0; + // Check by comparing the handle positions to the anchor if this manipulator group is a point for point in self.selected_points() { let Some(point_id) = point.as_anchor() else { continue }; - if positions != 0 { + if positions != 0 || one_or_more_segment_linear { self.convert_manipulator_handles_to_colinear(&vector_data, point_id, responses, layer); } else { for handle in vector_data.all_connected(point_id) { diff --git a/node-graph/gcore/src/vector/vector_data.rs b/node-graph/gcore/src/vector/vector_data.rs index ed7c32db3b..c9888984c7 100644 --- a/node-graph/gcore/src/vector/vector_data.rs +++ b/node-graph/gcore/src/vector/vector_data.rs @@ -11,7 +11,7 @@ use crate::transform::Transform; use crate::vector::click_target::{ClickTargetType, FreePoint}; use crate::{AlphaBlending, Color, GraphicGroupTable}; pub use attributes::*; -use bezier_rs::ManipulatorGroup; +use bezier_rs::{BezierHandles, ManipulatorGroup}; use core::borrow::Borrow; use core::hash::Hash; use dyn_any::DynAny; @@ -334,6 +334,13 @@ impl VectorData { index.flat_map(|index| self.segment_domain.connected_points(index).map(|index| self.point_domain.ids()[index])) } + /// Returns the number of linear segments connected to the given point. + pub fn connected_linear_segments(&self, point_id: PointId) -> usize { + self.segment_bezier_iter() + .filter(|(_, bez, start, end)| ((*start == point_id || *end == point_id) && matches!(bez.handles, BezierHandles::Linear))) + .count() + } + /// Get an array slice of all segment IDs. pub fn segment_ids(&self) -> &[SegmentId] { self.segment_domain.ids() From 0c376d1f9b3ac9898dd262141a70bb3fa17d6a14 Mon Sep 17 00:00:00 2001 From: Dennis Kobert Date: Mon, 30 Jun 2025 12:07:09 +0200 Subject: [PATCH 41/44] Disable preprocessor insertion of IntoNodes in the graph to avoid intermittent math node type errors (#2802) Disable insertion of into nodes into the graph --- editor/src/node_graph_executor/runtime.rs | 4 +--- node-graph/preprocessor/src/lib.rs | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/editor/src/node_graph_executor/runtime.rs b/editor/src/node_graph_executor/runtime.rs index 40ca633f09..a93f73546c 100644 --- a/editor/src/node_graph_executor/runtime.rs +++ b/editor/src/node_graph_executor/runtime.rs @@ -227,9 +227,7 @@ impl NodeRuntime { } async fn update_network(&mut self, mut graph: NodeNetwork) -> Result { - if cfg!(not(test)) { - preprocessor::expand_network(&mut graph, &self.substitutions); - } + preprocessor::expand_network(&mut graph, &self.substitutions); let scoped_network = wrap_network_in_scope(graph, self.editor_api.clone()); diff --git a/node-graph/preprocessor/src/lib.rs b/node-graph/preprocessor/src/lib.rs index 3e0d2d172e..50c265f92f 100644 --- a/node-graph/preprocessor/src/lib.rs +++ b/node-graph/preprocessor/src/lib.rs @@ -61,7 +61,7 @@ pub fn generate_node_substitutions() -> HashMap { ( NodeId(i as u64), match inputs.len() { - 1 => { + 1 if false => { let input = inputs.iter().next().unwrap(); let input_ty = input.nested_type(); From 217d112aae48d647dd3cec450dacc962a25c4ae4 Mon Sep 17 00:00:00 2001 From: Keavon Chambers Date: Mon, 30 Jun 2025 08:02:22 -0700 Subject: [PATCH 42/44] Update the readme with a new video --- README.md | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 629c9acdbd..39bc50abaf 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ **Graphite is a free, open source vector and raster graphics engine, [available now](https://editor.graphite.rs) in alpha. Get creative with a fully nondestructive editing workflow that combines layer-based compositing with node-based generative design.** -Having begun life as a vector editor, Graphite continues evolving into a generalized, all-in-one graphics toolbox that's built more like a game engine than a conventional creative app. The editor's tools wrap its node graph core, providing user-friendly workflows for vector, raster, and beyond. Photo editing, motion graphics, digital painting, desktop publishing, and VFX compositing are additional competencies from the [roadmap](https://graphite.rs/features/#roadmap) making Graphite into a highly versatile content creation tool. +Having begun life as a vector editor, Graphite continues evolving into a generalized, all-in-one graphics toolbox that's built more like a game engine than a conventional creative app. The editor's tools wrap its node graph core, providing user-friendly workflows for vector, raster, and beyond. Photo editing, motion graphics, digital painting, desktop publishing, and VFX compositing are additional competencies on the planned [roadmap](https://graphite.rs/features/#roadmap) making Graphite into a highly versatile content creation tool. Learn more from the [website](https://graphite.rs/), subscribe to the [newsletter](https://graphite.rs/#newsletter), consider [volunteering](https://graphite.rs/volunteer/) or [donating](https://graphite.rs/donate/), and remember to give this repository a ⭐! @@ -58,22 +58,26 @@ Learn more from the [website](https://graphite.rs/), subscribe to the [newslette

+https://github.com/user-attachments/assets/e0b80e09-6f12-41e5-9183-8e9ee04343bd + +## Support our mission ❤️ + +Graphite is 100% community built and funded. Please become a part of keeping the project alive and thriving with a [donation](https://graphite.rs/donate/) if you share a belief in our **mission**: + +> Graphite strives to unshackle the creativity of every budding artist and seasoned professional by building the best comprehensive art and design tool that's accessible to all. +> +> Mission success will come when Graphite is an industry standard. A cohesive product vision and focus on innovation over imitation is the strategy that will make that possible. + ## Screenshots -!["Isometric Fountain" vector artwork](https://static.graphite.rs/content/index/gui-demo-node-graph-isometric-fountain.png) +![Made using nondestructive boolean operations and procedural polka dot patterns](https://github.com/user-attachments/assets/decb7011-18c2-4c68-82af-d1fa5064244a) -!["Marbled Mandelbrot" fractal raster artwork](https://static.graphite.rs/content/index/gui-demo-fractal__3.png) +![Mandelbrot fractal filled with a noise pattern, procedurally generated and infinitely scalable](https://github.com/user-attachments/assets/9e023997-185b-4f43-a724-797d308d9e7b) + +![Design for a magazine spread, a preview of the upcoming focus on desktop publishing](https://github.com/user-attachments/assets/90eca551-5868-4f8d-9016-33958bf96345) ## Contributing/building the code Are you a graphics programmer or Rust developer? Graphite aims to be one of the most approachable projects for putting your engineering skills to use in the world of open source. See [instructions here](https://graphite.rs/volunteer/guide/) for setting up the project and getting started. *By submitting code for inclusion in the project, you are agreeing to license your changes under the Apache 2.0 license, and that you have the authority to do so. Some directories may have other licenses, like dual-licensed MIT/Apache 2.0, and code submissions to those directories mean you agree to the applicable license(s).* - -## Support our mission ❤️ - -Graphite is 100% community built and funded. Please become a part of keeping our project alive and thriving with a [donation](https://graphite.rs/donate/) if you share a belief in our mission: - -> Graphite strives to unshackle the creativity of every budding artist and seasoned professional by building the best comprehensive art and design tool that's accessible to all. -> -> Mission success will come when Graphite is an industry standard. A cohesive product vision and focus on innovation over imitation is the strategy that will make that possible. From d7fbbac95ebaabaaa42d36be790c79e1705b6b63 Mon Sep 17 00:00:00 2001 From: Keavon Chambers Date: Mon, 30 Jun 2025 10:04:37 -0700 Subject: [PATCH 43/44] Add videos to the website home page and features page --- website/content/_index.md | 54 ++++++----- website/content/features.md | 17 +++- .../code-quality-guidelines.md | 4 +- website/sass/base.scss | 26 +++--- website/sass/page/features.scss | 10 +++ website/sass/page/index.scss | 90 ++++++++++++++----- 6 files changed, 143 insertions(+), 58 deletions(-) diff --git a/website/content/_index.md b/website/content/_index.md index 98d7c321c9..a22928a9c2 100644 --- a/website/content/_index.md +++ b/website/content/_index.md @@ -164,9 +164,23 @@ meta_description = "Open source free software. A vector graphics creativity suit --- - +
+
-Starting life as a vector editor, Graphite is evolving into a generalized, all-in-one graphics toolbox that's built more like a game engine than a conventional creative app. The editor's tools wrap its node graph core, providing user-friendly workflows for vector, raster, and beyond. +Starting life as a vector editor, Graphite is evolving into a generalized, all-in-one graphics toolbox that's built more like a game engine than a conventional creative app. The editor's tools wrap its node graph core, providing user-friendly workflows for vector, raster, animation, and beyond. + +Start creating + +
+
+ + + +
+
@@ -276,7 +290,23 @@ Once it's ready to shine, Graphite's code architecture is structured to deliver
- + + + + +
@@ -363,23 +393,7 @@ Graphite's representation of artwork as a node graph lets you customize, compose
- - - - - +
diff --git a/website/content/features.md b/website/content/features.md index 307e8bbc17..ad0e7796c9 100644 --- a/website/content/features.md +++ b/website/content/features.md @@ -2,7 +2,8 @@ title = "Graphite features" [extra] -css = ["/page/features.css", "/component/feature-box.css", "/component/feature-icons.css"] +css = ["/page/features.css", "/component/feature-box.css", "/component/feature-icons.css", "/component/youtube-embed.css"] +js = ["/js/youtube-embed.js"] +++
@@ -17,6 +18,20 @@ In 2025, stay tuned for performance improvements, native multiplatform desktop a
+
+
+ +
+
+
+ Rust-Powered Graphics Editor: How Graphite's Syntax Trees Revolutionize Image Editing +
+
+
+ +
+
+
diff --git a/website/content/volunteer/guide/starting-a-task/code-quality-guidelines.md b/website/content/volunteer/guide/starting-a-task/code-quality-guidelines.md index 375c8cf180..1ea8e0885f 100644 --- a/website/content/volunteer/guide/starting-a-task/code-quality-guidelines.md +++ b/website/content/volunteer/guide/starting-a-task/code-quality-guidelines.md @@ -35,7 +35,9 @@ Comments should usually be placed on a separate line above the code they are ref ## Blank lines -Please make a habit of grouping together related lines of code in blocks separated by blank lines. If you have dozens of lines comprising a single unbroken block of logic, you are likely not splitting it apart enough to aid readability. Find sensible places to partition the logic and insert blank lines between each. Roughly 10% of the code you write should ideally be blank lines, otherwise you are likely underutilizing them at the expense of readability. +Please make a habit of grouping together related lines of code in blocks separated by blank lines. These are like your paragraphs if you were writing a novel — they greatly aid readability and your copy editor would have significant concerns with your writing if they were absent. + +If you have dozens of lines comprising a single unbroken block of logic, you are likely not splitting it apart enough to aid readability. Find sensible places to partition the logic and insert blank lines between each. Roughly 10% of the code you write should ideally be blank lines, otherwise you are likely underutilizing them at the expense of readability. ## Imports diff --git a/website/sass/base.scss b/website/sass/base.scss index b0b7098ea5..d938d26a9a 100644 --- a/website/sass/base.scss +++ b/website/sass/base.scss @@ -151,19 +151,6 @@ body > .page { .heart.heart { // The same color is also used below in the SVG after the `%23` (URL-encoded `#`) color: #cc304f; - - &::after { - content: ""; - background-image: url('data:image/svg+xml;utf8,\ - \ - '); - display: inline-block; - width: 0.75em; - height: 0.75em; - margin-left: 0.25em; - margin-bottom: -0.1em; - vertical-align: baseline; - } } @media screen and (max-width: 1200px) { @@ -683,6 +670,19 @@ hr, } } +.heart::after { + content: ""; + background-image: url('data:image/svg+xml;utf8,\ + \ + '); + display: inline-block; + width: 0.75em; + height: 0.75em; + margin-left: 0.25em; + margin-bottom: -0.1em; + vertical-align: baseline; +} + // blockquote { // padding: 32px 80px; // background: rgba(0, 0, 0, 0.0625); diff --git a/website/sass/page/features.scss b/website/sass/page/features.scss index a305d811fb..41590b908a 100644 --- a/website/sass/page/features.scss +++ b/website/sass/page/features.scss @@ -1,3 +1,13 @@ +.video-container { + background: var(--color-fog); + + > div { + margin: calc(20 * var(--variable-px)) auto; + width: 100%; + max-width: 800px; + } +} + #roadmap { width: 100%; text-align: center; diff --git a/website/sass/page/index.scss b/website/sass/page/index.scss index 0997758b86..9c82d1f0f8 100644 --- a/website/sass/page/index.scss +++ b/website/sass/page/index.scss @@ -18,24 +18,25 @@ #tagline { h1 { span { - position: relative; + position: relative; - &::after { - content: ""; - pointer-events: none; - position: absolute; - left: 0; - right: 0; - top: 100%; - // Dimensions: 480x40 - height: 100%; - margin-top: -0.2em; - background: url("https://static.graphite.rs/textures/text-sketch-underline.png"); - background-repeat: no-repeat; - background-size: contain; + &::after { + content: ""; + pointer-events: none; + position: absolute; + left: 0; + right: 0; + top: 100%; + // Dimensions: 480x40 + height: 100%; + margin-top: -0.2em; + background: url("https://static.graphite.rs/textures/text-sketch-underline.png"); + background-repeat: no-repeat; + background-size: contain; + } } - }} - + } + p { font-size: 1.2rem; @@ -112,15 +113,61 @@ // ▛ OVERVIEW ▜ #overview { background-color: var(--color-cloud); + + .sizzle-video { + display: flex; + flex-wrap: nowrap; + max-width: 100%; + + .block { + min-width: 0; + flex-direction: row; + + &.text { + flex: 1 4 100%; + flex-direction: column; + + p:has(.button) { + margin-top: 20px; + } + } + + &.video { + flex: 0 1 fit-content; + } + } + + @media screen and (max-width: 900px) { + flex-wrap: wrap; + + .block.video { + flex: 1 1 100%; + justify-content: center; + } + } + + @media screen and (max-width: 1100px) { + p:has(.button) { + display: none; + } + } + } } // ▙ OVERVIEW ▟ +// ▛ DONATE ▜ +#donate { + h2 { + color: #cc304f; + } +} +// ▙ DONATE ▟ + // ▛ PROCEDURALISM ▜ #proceduralism { background-color: var(--color-slate); color: white; - margin-top: 0; - + .diptych { background: black; color: var(--color-fog); @@ -183,9 +230,6 @@ } // ▙ PROCEDURALISM ▟ -// ▛ DONATE ▜ -// ▙ DONATE ▟ - // ▛ NEWSLETTER ▜ #newsletter { background-color: var(--color-peach); @@ -355,7 +399,7 @@ margin: calc(20 * var(--variable-px)) auto; width: 100%; max-width: 800px; - + + p { margin-top: 0; } @@ -377,7 +421,7 @@ // ▛ RECENT NEWS ▜ #recent-news { background-color: var(--color-parchment); - + .banner img { width: 100%; height: auto; From d8e15aeb93c49286c11321118c14f93eff7afe1f Mon Sep 17 00:00:00 2001 From: Keavon Chambers Date: Mon, 30 Jun 2025 15:53:02 -0700 Subject: [PATCH 44/44] Update the video on the project readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 39bc50abaf..e5ceda081e 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,7 @@ Learn more from the [website](https://graphite.rs/), subscribe to the [newslette

-https://github.com/user-attachments/assets/e0b80e09-6f12-41e5-9183-8e9ee04343bd +https://github.com/user-attachments/assets/f4604aea-e8f1-45ce-9218-46ddc666f11d ## Support our mission ❤️